web-dev-qa-db-ja.com

整数の最大値

Cでは、整数(32ビットマシン用)は32ビットで、範囲は-32,768から+ 32,767です。 Javaでは、整数も32ビットですが、-2,147,483,648から+2,147,483,647の範囲です。

ビット数が同じであっても、Javaで範囲がどう違うのかわかりません。誰かがこれを説明できますか?

242
stackuser

Cでは、言語自体は特定のデータ型の表現を決定しません。マシンによって異なりますが、組み込みシステムではintは16ビット幅ですが、通常は32ビットです。

唯一の要件は、サイズによってshort int <= int <= long intであることです。また、intは、プロセッサのネイティブ容量 を表すようにすることをお勧めします。

すべての種類が署名されています。 unsigned修飾子を使うと、値の一部として最上位ビットを使うことができます(そうでない場合は符号ビット用に予約されています)。

可能なデータ型の可能な値の短い表は以下のとおりです。

          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

In Javathe Java言語仕様 はデータ型の表現を決定します。

順序は、byte 8ビット、short 16ビット、int 32ビット、long 64ビットです。これらの型はすべてsignedです。符号なしバージョンはありません。ただし、ビット操作では、符号なしの数字として扱われます(つまり、すべてのビットが正しく処理されます)。

文字データ型charは16ビット幅、unsignedで、UTF-16エンコーディングを使用して文字を保持します(ただし、charに無効な文字コードポイントを表す任意の符号なし16ビット整数を割り当てることは可能です)

          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535
337
gaborsch

Cでは、整数(32ビットマシン用)は32ビットで、範囲は-32768から+ 32767です。

違う。 2の補数表現の32ビット符号付き整数の範囲は-231 2まで31-1、2、147、483、648から2、147、483、647に等しい。

70
Kos

32ビット整数は-2,147,483,648から2,147,483,647の範囲です。しかし、あなたが32ビットマシン上にいるという事実は、あなたのCコンパイラが32ビット整数を使うという意味ではありません。

18

C言語の定義では、さまざまなデータ型に対して minimum の範囲を指定しています。 intの場合、この最小範囲は-32767から32767です。これはint 少なくとも 16ビット幅でなければならないことを意味します。実装はそれに対応してより広い範囲でより広いint型を自由に提供することができます。例えば、私が取り組んでいるSLES 10開発サーバーでは、範囲は-2147483647から2137483647です。

16ビットのint型を使うシステムがまだいくつかあります(All The World Is Not VAX (x86)しかし、32ビットのint型を使うものはたくさんあり、64ビットを使うものもあるかもしれません。

C言語は異なるアーキテクチャ上で動作するように設計されています。 Javaはこれらのアーキテクチャの違いを隠す仮想マシンで動作するように設計されています。

13
John Bode

ポスターにはJavaの型が混在しています。 Javaでは、彼のC inはshortです。short(16ビット)= -32768〜32767 int(32ビット)= -2,147,483,648〜2,147,483,647

http://docs.Oracle.com/javase/tutorial/Java/nutsandbolts/datatypes.html

7
Brill Pappin

これは、Cでは32ビットマシン上の整数が32ビットを格納するために使用されることを意味するのではなく、16ビットである可能性があるためです。マシンに依存します(実装依存)。

6
BlueLettuce16

Javaのintと厳密に同等なものは、Cのlong intです。

編集:int32_tが定義されている場合、それは精度の点で同等です。 long intは、Javaのintの精度を保証します。これは、サイズが少なくとも32ビットであることが保証されているためです。

5
UmNyobe

実際には、intshortlongのビット単位のサイズは、コンパイラの実装によって異なります。

例えば。私のUbuntu 64ビットでは32ビットにshortがありますが、もう1つの32ビットUbuntuバージョンでは16ビットです。

4
Alex

それは実際には理解するのが本当に簡単です、あなたはグーグル計算機でそれを計算することさえできます:あなたはintのために32ビットを持ち、そしてコンピュータはバイナリです。 2 ^ 32を計算すると、4,294,967,296になります。したがって、この数を2で割ると(半分が負の整数、残りの半分が正の整数であるため)、2,147,483,648となります。この数字は32ビットで表現できる最大の整数ですが、注意すると2,147,483,648は2,147,483,647より1大きいことに気付くでしょうが、これは数字の1つが0を表しているためです。残念ながら2 ^ 2 32は奇数ではないので、途中に1つの数字しかないので、可能な整数の暗号は1つ少なくなり、負の整数は半分の2,147,483,648になります。

以上です。それは言語ではなくマシンに依存します。

1
Emos Turi

__int32のCの範囲は-2147483648から2147483647です。 全範囲についてはこちらをご覧ください。

unsigned short 0 to 65535
signed short –32768 to 32767
unsigned long 0 to 4294967295
signed long –2147483648 to 2147483647

特にビット操作を含むコードを書くとき、特定のサイズの変数を使いたい場合、 'int'が32ビットになるという保証はありません、 'Standard Integer Types'を使うべきです。

Javaで

Intデータ型は、32ビット符号付き2の補数整数です。最小値は-2,147,483,648、最大値は2,147,483,647です。

1
Achintya Jha