Cでは、整数(32ビットマシンの場合)は32ビットで、範囲は-32,768〜+32,767です。Javaでは、integer(long)も32ビットですが、範囲は-2,147,483,648から+2,147,483,647です。
ビット数が同じでも、Javaで範囲がどのように異なるかわかりません。誰かがこれを説明できますか?
Cでは、整数(32ビットマシンの場合)は32ビットで、範囲は-32,768〜+32,767です。Javaでは、integer(long)も32ビットですが、範囲は-2,147,483,648から+2,147,483,647です。
ビット数が同じでも、Javaで範囲がどのように異なるかわかりません。誰かがこれを説明できますか?
回答:
で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ビット、short
16ビット、int
32ビット、long
64ビットです。これらのタイプのすべてがされて署名し、何の符号なしのバージョンではありません。ただし、ビット操作では、数値は符号なしとして扱われます(つまり、すべてのビットが正しく処理されます)。
文字データ型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
int
s を追加するのは難しい...
int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));
印刷物2147483648
及びチャーが unsigned型である
Integer.MAX_VALUE + 1
は0x80000000
、オーバーフローのため(そしてと等しいInteger.MIN_VALUE
)、16進数です。符号なし(long)に変換すると、符号ビットは値ビットのように扱われるため、になります2147483648
。ご連絡ありがとうございますchar
。char
は符号なしです、そうですが、charは実際には計算に使用されないので、リストから除外しました。
32ビット整数の範囲は-2,147,483,648〜2,147,483,647です。ただし、32ビットマシンを使用しているからといって、C
コンパイラが32ビット整数を使用しているわけではありません。
int
、32ビットマシン用にコンパイルするときに32ビットとして解釈する「マシンの自然な幅」であると述べています。
C言語の定義では、さまざまなデータ型の最小範囲を指定しています。の場合int
、この最小範囲は-32767〜32767 です。つまり、int
は少なくとも 16ビット幅でなければなりません。実装はint
、それに応じてより広い範囲を持つより広い型を自由に提供できます。たとえば、私が作業しているSLES 10開発サーバーでは、範囲は-2147483647〜2137483647です。
そこにいくつかのシステムがまだあることに使用する16ビットのint
種類(すべてのザ・ワールド・されていない A VAXのx86)が、使用の32ビット・そのたくさんあるint
こと、使用の64ビットは種類があり、多分少数。
C言語は、さまざまなアーキテクチャーで実行できるように設計されています。Javaは、これらのアーキテクチャの違いを隠す仮想マシンで実行するように設計されています。
INT_MIN
として指定され-32767
ます。2の補数を仮定しないでください。
ジャワの厳密な等価物は、int
あるlong int
Cで
編集: int32_t
が定義されている、精度に関しては同等です。サイズが少なくとも32ビットであることが保証されているためlong int
、Javaの精度をint
保証します。
int32_t
それはあなたのコンパイラによって定義されている場合と同等です
これは、Cでは32ビットマシンの整数は、32ビットがそれを格納するために使用されることを意味するのではなく、16ビットの場合もあるからです。それはマシンに依存します(実装依存)。
int
ます。しかしlimits.h
、正確な真実を見つけるのに役立ちます
ポスターには、Javaタイプが混在しています。Javaでは、彼のC inは短いです:short(16ビット)= -32768〜32767 int(32ビット)= -2,147,483,648〜2,147,483,647
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
それは実際に理解することは本当に簡単です、あなたはそれをグーグル計算機で計算することさえできます:あなたはintに32ビットを持ち、コンピュータはバイナリなので、あなたはビットごとに2つの値を持つことができます(スポット)。2 ^ 32を計算すると、4,294,967,296になります。したがって、この数値を2で割ると(それらの半分は負の整数で残りの半分は正なので)、2,147,483,648になります。この数値は32ビットで表すことができる最大のintですが、注意すると、2,147,483,648が2,147,483,647よりも1大きいことに気づくでしょう。これは、数値の1つが0を表しているためです。 32は奇数ではないため、真ん中の数値は1つだけではありません。したがって、正の整数の暗号は1つ少なくなり、負の数は半分の2,147,483,648になります。
以上です。言語ではなくマシンに依存します。
int
マシンに依存しません。int
== 32ビット符号付き、2の補数はJava言語仕様で定義され、陽極酸化されたunobtainiumのシートに刻印されています。(OK、最後のビットではないかもしれません。)
__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(両端を含む)です。
標準Cでは、INT_MAXを最大の「int」値として使用できます。この定数は「limits.h」で定義する必要があります。他のタイプ(http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html)にも同様の定数が定義されています。これらの定数は実装に依存しますが、最小ビットに応じた最小値があります標準で指定されているように、各タイプ。