323

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

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

4

11 に答える 11

428

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

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

順序はbyte、8 ビット、short16 ビット、int32 ビット、long64 ビットです。これらのタイプはすべて署名済みであり、署名されていないバージョンはありません。ただし、ビット操作は数値を符号なしとして扱います (つまり、すべてのビットを正しく処理します)。

文字データ型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
于 2013-02-21T14:51:00.303 に答える
79

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

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

于 2013-02-21T14:44:50.550 に答える
22

32 ビット整数の範囲は -2,147,483,648 ~ 2,147,483,647 です。Cただし、32 ビット マシンを使用しているからといって、コンパイラが 32 ビット整数を使用しているわけではありません。

于 2013-02-21T14:44:00.317 に答える
16

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

int16 ビット型 (All The World Is Not A VAX x86)を使用するシステムはまだいくつかありますが、32 ビット型を使用するシステムはたくさんあり、int64 ビットを使用するシステムもいくつかあります。

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

于 2013-02-21T15:06:18.027 に答える
10

Java の厳密な同等物はintClong intにあります。

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

于 2013-02-21T14:41:15.720 に答える
8

ポスターには、Java タイプが混在しています。Java では、彼の C は 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

于 2013-08-19T01:52:13.540 に答える
7

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

于 2013-02-21T14:42:40.097 に答える
5

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

たとえば、私のUbuntu 64ビットでshort32ビット単位で、別の32ビットUbuntuバージョンでは16ビット単位です。

于 2013-02-21T14:52:44.447 に答える
2

__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 ビットになるという保証はありません。特定のサイズの変数を使用する場合、特にビット操作を伴うコードを記述する場合は、「標準整数型」を使用する必要があります。

Javaで

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

于 2013-02-21T14:43:16.010 に答える