int、Int16、Int32、Int64の違いは何ですか?


回答:


348

整数のタイプごとに、異なる範囲のストレージ容量があります

   Type      Capacity

   Int16 -- (-32,768 to +32,767)

   Int32 -- (-2,147,483,648 to +2,147,483,647)

   Int64 -- (-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807)

ジェームズ・サザーランドが彼の答えで述べたように:

intそしてInt32確かに同義です。int少し見慣れInt32たものになり、コードを読む人にとって32ビット性がより明確になります。Int32サイズが重要な場合(暗号化コード、構造)、「整数」だけが必要な場合はintを使用する傾向があるので、将来のメンテナはint、適切な場合に拡大しても安全であると認識し Int32ますが、同じ方法で変数の変更に注意する必要があります。

結果のコードは同じになります。違いは、単に可読性またはコードの外観の1つです。


1
値が65,535(符号付き)または-32,768から32,767(符号なし)を超えないことがわかっている場合はint16、単純に使用するのではなく、メモリリソースを節約するために整数を定義する方がよいintでしょう。
ᴍᴀᴛᴛʙᴀᴋᴇʀ14

8
intとint32は同義語にすることができますが、必ずしもそうである必要はありません。現在、販売されているほとんどのシステムは64ビットです。この場合、intは64ビットになります。
Martijn Otto

4
パフォーマンスの観点からどちらを使用するかを決定しようとここに来たマシューT.ベイカーや他のすべての人にとって、多くの場合IntegerがInt16よりも効率的であることを示唆するこの投稿をチェックする必要があります:stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.

19
@MartijnOtto質問のタグはC#です。C#では、intある常に Int32関係なく、システムの、。たぶん、あなたはC ++を考えていますか?

9
@MattBaker:一般に、最近のコンピューターでは、int16はint32(実際にはint64)と同じだけのスペースを必要とします。これは、ほとんどの操作が効率的になるように、データをパディングしてアクセスを32ビットまたは64ビットの境界に揃えるためです。 (それぞれ32または64ビットモード)。これは、非境界整列アクセスが一部のアーキテクチャでは途方もなく非効率的であり、他のアーキテクチャでは不可能だからです。
Joel

118

ここでの唯一の違いはサイズです。ここでのすべてのint型は、さまざまなサイズの符号付き整数値です

  • Int16:2バイト
  • Int32およびint:4バイト
  • Int64 :8バイト

Int64と残りの間に小さな違いが1つあります。32ビットプラットフォームでは、Int64保存場所への割り当てはアトミックであるとは限りません。他のすべてのタイプで保証されています。


私が使用している場合Int64には32 bit Windows Operating System、その後、私が直面する可能性の問題は何ですか?例はありますか?
シャイユット

70

int

C#で定義されているプリミティブデータ型です。

FCLタイプのInt32にマッピングされます。

これは値型であり、System.Int32構造体を表します。

署名され、32ビットを使用します。

最小値は-2147483648、最大値は+2147483647です。

Int16

FCLタイプです。

C#では、shortはInt16にマップされます。

これは値型であり、System.Int16構造体を表します。

署名されており、16ビットを使用します。

最小値は-32768、最大値は+32767です。

Int32

FCLタイプです。

C#では、intはInt32にマップされます。

これは値型であり、System.Int32構造体を表します。

署名され、32ビットを使用します。

最小値は-2147483648、最大値は+2147483647です。

Int64

FCLタイプです。

C#では、longはInt64にマップされます。

これは値型であり、System.Int64構造体を表します。

署名され、64ビットを使用します。

最小値は-9,223,372,036,854,775,808で、最大値は9,223,372,036,854,775,807です。


その追加するだけでInt64データ型が使用して表すことができるLか、l接尾辞ながら、Int16またはInt32C#での接尾辞を持っていません。
RBT

14

Jeffrey Richter(.NET Framework開発の寄稿者の1人)の本「CLR via C#」によれば、

intはC#コンパイラで許可されているプリミティブ型ですが、Int32はフレームワーククラスライブラリ型です(CLSに準拠する言語で利用可能)。実際、intはコンパイル時にInt32に変換されます。

また、

C#では、longはSystem.Int64にマップされますが、別のプログラミング言語では、longはInt16またはInt32にマップできます。実際、C ++ / CLIはInt32として長く扱います。

実際、ほとんどの(.NET)言語では、キーワードとして長く扱われず、それを使用するコードをコンパイルしません。

私はこの著者や、主にそのような相互運用性の懸念に関して、言語固有のプリミティブ型(つまり、int)よりもFCL型(すなわち、Int32)を好む.NETに関する多くの標準的な文献を見てきました。


8

何もない。タイプ間の唯一の違い、サイズ(および、したがって、それらが表すことができる値の範囲)です。


8

16、32、64タイプに関する非常に重要な注記:

このクエリを実行すると... Array.IndexOf(new Int16 [] {1,2,3}、1)

あなたが求めているので、zero(0)を取得するとします... 1、2、または3の配列内で1です。回答として-1を取得する場合、1が1、2、または3の配列内にないことを意味します。

私が見つけたものをチェックしてください:次のすべては-1ではなく0を与えるはずです(私はすべてのフレームワークバージョン2.0、3.0、3.5、4.0でこれをテストしました)

C#:

Array.IndexOf(new Int16[]{1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32[]{1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64[]{1,2,3}, 1) = 0 (correct)

VB.NET:

Array.IndexOf(new Int16(){1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32(){1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64(){1,2,3}, 1) = -1 (not correct)

つまり、私のポイントは、Array.IndexOfの比較では、Int32のみを信頼することです。


7
最初の例がそのように機能する理由を明確にするために、最初のリテラル1、2、および3は暗黙的にキャストさshortれて配列に収まるようにし、2番目のリテラル1は通常のままにしintます。 (int)1等しく考慮されていない(short)1(short)2(short)3、従って結果は-1。

4
C#バージョンでも同様の調整が可能ですが、FYIの単純な型指定子でこの問題を修正Array.IndexOf(new Int16(){1,2,3}, 1S) Array.IndexOf(new Int32(){1,2,3}, 1I) Array.IndexOf(new Int64(){1,2,3}, 1L)できます。すべて期待どおりに機能します。
Mark Hurd

1
そして、機能しないものはObject[],Objectオーバーロードを使用しています。C#は必要に応じintて暗黙的にをa longに引き上げます(また、a shortintorに引き上げますlong)が、object代わりにオーバーロードを使用して、暗黙的にキャストダウンしません。With Option Strict OnまたはOffVBは、統一された型が提供されている場合のみ型付きオーバーロードを使用しobjectます。それ以外の場合は、オーバーロードを使用します。
Mark Hurd

あなたの答えは誤解を招くものです。コードは異なるタイプの値を比較しています。結論for Array.IndexOf comparisons, only trust Int32!は間違っています。最後の1引数を対応する配列型にキャストすると、期待どおりに機能します。
ドン・チードル

これは非常に興味深く予期しない動作です(intからlongは機能しますが、short to intは機能しません)。
sth_Weird 2017年

7

編集:これは、C#にはまったく当てはまりません。この質問に答えたときに見逃したタグです。C#固有の回答がさらにある場合は、代わりに投票してください。


それらはすべて、さまざまなサイズの整数を表します。

ただし、非常に小さな違いがあります。

int16、int32、およびint64はすべて固定サイズです。

intのサイズは、コンパイル対象のアーキテクチャによって異なります。C仕様では、intがshort以上の値として定義されているだけですが、実際にはターゲットとするプロセッサの幅であり、これはおそらく 32ビットですが、そうではないかもしれません。


1
これは実際に正しいとする唯一のものであるとして、これが受け入れ答えなければなりません
MJS

2
いいえ、これはC#には当てはまりません。C#のintは常に32ビットのサイズです。Cの場合、はい、この複雑さに対処する必要があり、Cのコードでマクロを見て、可変のintサイズを処理することがよくあります。参照してくださいecma-international.org/publications/files/ECMA-ST/Ecma-334.pdfのページ18
アナンケ

@Anankeああ、C#タグを逃した。回答に対する投票を
取り消す

6
  1. intおよびint321つと同じ(32ビット整数)
  2. int16 short int(2バイトまたは16ビット)
  3. int64 longデータ型(8バイトまたは64ビット)

2
intが32ビットであることは保証されていません。
mjs 2014年

8
@mjs、これは単に真実ではありません。C#ではint、はのエイリアスであるためInt32、常に32ビットであることが保証されています。
David Arno、

実際にmjsが言うことは正しいです。INTはシステムx86またはx64に基づく整数を意味するため、システムがx64の場合、intはInt64になるため、32であるとは限りません。 。
ヨーグルトゥ

5
いいえ、David Arnoの言うとおりです。C#言語では、32ビット整数(Int32)を意味する「int」を明確に定義しています。他の言語(C / C ++など)では指定されていない場合がありますが、この質問には「C#」というタグが付いています。
Theo Brinkman、2018

正しい@TheoBrinkman、ここではMicrosoftのページには、C#の整数数値型にあります:docs.microsoft.com/en-us/dotnet/csharp/language-reference/...
マックスBarraclough

5

どちらも同義語ですが、両者の間にわずかな違いがあることがわかりました。

1)Int32作成中は使用できませんenum

enum Test : Int32
{ XXX = 1   // gives you compilation error
}

enum Test : int
{ XXX = 1   // Works fine
}

2)Int32システム宣言の下に来る。削除using.Systemするとコンパイルエラーが発生しますが、int


-8

Int = Int32->オリジナルのlong型

Int16->元のint

Int64->新しいデータ型が64ビットシステムの後に利用可能になる

「int」は下位互換性のためにのみ使用できます。プログラムをより正確にするために、新しいint型を実際に使用する必要があります。

---------------

途中でもう1つ気づいたのは、IntInt16、Int32、Int64に似た名前のクラスがないことです。TryParseintegerのような便利な関数はすべてから来ていInt32.TryParseます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.