整数の最大値


291

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

ビット数が同じでも、Javaで範囲がどのように異なるかわかりません。誰かがこれを説明できますか?


35
Javaでintの最大値と最小値を取得するには、Integer.MAX_VALUEおよびInteger.MIN_VALUEを使用します
live-love

5
@stackuser-あなたの質問に対するいくつかの良い答え-あなたはそれを受け入れるべきです:)
Darragh Enright

2
@DarraghEnright彼が最後に2015年3月に見られた、彼が戻ってくるとは思えない:(
Ungeheuer

4
@エイドリアンハハ-私はそうは思わない!私が思うに少し起こります。私は、SOが特定の条件下で答えを簡単に自動受け入れることができると常に想像していました。質問が特定の年齢を超えている場合、OPはAWOLであり、多数の賛成票がある明らかに役立つ答えがあります。
Darragh Enright

2
@DarraghEnright同意する。しかし、OPはここに2週間前に来ました、彼は受け入れる機会があったので、技術的には彼は離れていません。
gaborsch 16

回答:


392

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

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

順序は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

10
C規格は、等INT_MAX、LONG_MAX、の最小値を指定する
オリバーCharlesworth

13
Java 8に署名なしの整数も追加さ
Jakub Kotowski '26

4
@jkbkot、ありがとうございます。表現はまだ署名されているようですが、一部の署名されていない操作は関数として実装されています。2つの署名されていないints を追加するのは難しい...
gaborsch 2014年

5
@GaborSchでJava、int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));印刷物2147483648及びチャーが unsigned型である
howlger

2
@howlger Integer.MAX_VALUE + 10x80000000、オーバーフローのため(そしてと等しいInteger.MIN_VALUE)、16進数です。符号なし(long)に変換すると、符号ビットは値ビットのように扱われるため、になります2147483648。ご連絡ありがとうございますcharcharは符号なしです、そうですが、charは実際には計算に使用されないので、リストから除外しました。
gaborsch 2017年

72

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

違う。2の補数表現で32ビット符号付き整数の範囲を有する-2 31 2 31 -1 2,147,483,647に-2147483648に等しいです。


3
**はあなたの指数を修正しました、Cでもなく、私の意見ではあまり明確ではありません。:)
2013

2
よさそうだ、ありがとう!Pythonが多すぎると思います。^通常は避けますxor
コス

5
私のポイントは、Cには指数演算子がないため、特定の部分をコードとしてフォーマットする必要があるとはまったく考えていないと思います。:)
2013

19

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


1
少なくとも私のカーニハン氏とリッチー氏の「Cプログラミング言語」のコピーは、A4.2でint、32ビットマシン用にコンパイルするときに32ビットとして解釈する「マシンの自然な幅」であると述べています。
junix 2013

7
これは、私が信じているマシンではなく、コンパイラに依存しています。たとえば、64ビットマシンに16ビットコンパイラをインストールしました。
Ivaylo Strandjev 2013

もちろん、16ビットx86コード用の16ビットコンパイラは16ビットしか使用しませんでした。しかし、それは私の趣旨ではありませんでした。16ビットモードで実行されている32ビットx86プロセッサでも、ネイティブの容量は16ビットのみです。私のポイントは、コンパイラが重要なターゲットプラットフォームであるということです。たとえば、80286のコンパイラがある場合でも、16ビットのコードが生成されるため、16ビットの整数になります。
junix 2013

2
@junix私はそれが私の答えで私が指摘しているものだと思います。整数のビット数を指定するのはOSではありません。ターゲットプラットフォームはコンパイラのプロパティであり、動作しているOSや使用しているプロセッサではありません。
Ivaylo Strandjev 2013

最初のコメントで書いたように。「32ビットマシン用にコンパイルすると32ビットになります」。だから私は彼が彼が彼のターゲットプラットフォームを参照している、彼のOSを参照するか、自分のマシンされていない理解して何から彼の投稿でOPの書き込み「(32ビット・マシン用)整数」
junix

15

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

そこにいくつかのシステムがまだあることに使用する16ビットのint種類(すべてのザ・ワールド・されていない A VAXのx86)が、使用の32ビット・そのたくさんあるintこと、使用の64ビットは種類があり、多分少数。

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


16ビット整数の場合は、-3276である8、32ビット整数の場合32767に、それは-214748364ある8の範囲が指定されている2147483647から-2 ^(Nビット-1)〜+ 2 ^(Nビット-1 )
mythicalcoder

3
@Maven:5.2.4.2.1- INT_MINとして指定され-32767ます。2の補数を仮定しないでください。
ジョンボード

8

ジャワの厳密な等価物は、intあるlong intCで

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


あなたが正しい、int32_tそれはあなたのコンパイラによって定義されている場合と同等です
UmNyobe '21

7

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


1
さて、典型的な実装動作はに「マシン幅」を使用していることに注意する価値がありintます。しかしlimits.h、正確な真実を見つけるのに役立ちます
junix

3
しかし、実際には、32ビットのCコンパイラが32ビットのintなしで作成されたことはないと思います。この規格では、intのコンパイラー実装をモロニックな性質にすることができますが、何らかの理由で、モロニックCコンパイラーを作成する必要はありません。トレンドは、便利なCコンパイラを作成することです。
ランディン2013


4

実際のビットのサイズがintshortlong コンパイラの実装に依存します。

私のUbuntuの64の例は、私が持っているビットshort32別の32ビットUbuntuのバージョンにそれがあるときに、ビット16ビット。


2

それは実際に理解することは本当に簡単です、あなたはそれをグーグル計算機で計算することさえできます:あなたは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になります。

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


2
これは彼が求めたものではありません...質問は「なぜC intがJava intと異なるのか」です。
ElectronWill

そしてJavaでは、のサイズ int マシンに依存しませんint== 32ビット符号付き、2の補数はJava言語仕様で定義され、陽極酸化されたunobtainiumのシートに刻印されています。(OK、最後のビットではないかもしれません。)
スティーブンC

1

__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(両端を含む)です。


2
Cについて引用する値は、最小範囲にすぎません。
オリバーチャールズワース2013

@OliCharlesworth最小から最大までの範囲。
Achintya Jha 2013

6
つまり、各タイプの範囲は、上で引用した範囲よりも大きくすることができます。
オリバーチャールズワース2013

3
Cには__int32と呼ばれるものはありません。マイクロソフトには厳密に準拠したCコンパイラがないので、C以外のコンパイラがどのように機能するかを誰が気にしますか?関連する唯一のソースはISO9899で、5.2.4.2.1「整数型のサイズ」または7.20.2.1「正確な幅の整数型の制限」のいずれかです。Microsoft gooと互換性のあるものはありません。
ランディン

2
C99は、int32_t、int16_tなどを標準に追加します。Microsoftの追加機能と100%互換性はありませんが、同様に機能します。
モニカについて質問する

-1

標準Cでは、INT_MAXを最大の「int」値として使用できます。この定数は「limits.h」で定義する必要があります。他のタイプ(http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html)にも同様の定数が定義されています。これらの定数は実装に依存しますが、最小ビットに応じた最小値があります標準で指定されているように、各タイプ。


5
これは、OPの質問に対処するために実際にうまく行きません。また、回答の中心部分を別のサイトに埋め込むべきではありません。
Brad Koch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.