Maximaler Wert der Ganzzahl

291

In C beträgt die Ganzzahl (für 32-Bit-Maschinen) 32 Bit und reicht von -32.768 bis +32.767. In Java beträgt die Ganzzahl (lang) ebenfalls 32 Bit, reicht jedoch von -2.147.483.648 bis +2.147.483.647.

Ich verstehe nicht, wie unterschiedlich der Bereich in Java ist, obwohl die Anzahl der Bits gleich ist. Kann das jemand erklären?

Stackuser
quelle
35
Um die Max- und Min-Werte von int in Java zu erhalten, verwenden Sie Integer.MAX_VALUE und Integer.MIN_VALUE
live-love
5
@stackuser - Einige gute Antworten auf Ihre Frage - Sie sollten eine akzeptieren :)
Darragh Enright
2
@DarraghEnright er wurde zuletzt im März 2015 gesehen, ich bezweifle, dass er zurückkommt :(
Ungeheuer
4
@ Adrian haha ​​- ich denke nicht! Passiert wohl ein bisschen. Ich habe mir immer vorgestellt, dass SO Antworten unter bestimmten Bedingungen leicht automatisch akzeptieren kann - wenn die Frage über einem bestimmten Alter liegt, ist das OP AWOL und es gibt eine eindeutig nützliche Antwort mit einer hohen Anzahl von Upvotes.
Darragh Enright
2
@DarraghEnright zustimmen. Aber OP war hier ~ vor 2 Wochen, er hatte die Chance zu akzeptieren, also technisch ist er nicht weg.
Gaborsch

Antworten:

392

In C , selbst die Sprache bestimmt nicht die Darstellung bestimmter Datentypen. Es kann von Maschine zu Maschine variieren, auf eingebetteten Systemen intkann es 16 Bit breit sein, obwohl es normalerweise 32 Bit ist.

Die einzige Voraussetzung ist, dass short int<= int<= long intnach Größe. Es gibt auch eine Empfehlung, dassint die die native Kapazität des Prozessors darstellen sollte .

Alle Typen sind signiert. Dasunsigned Modifikator können Sie das höchste Bit als Teil des Werts verwenden (andernfalls ist es für das Vorzeichenbit reserviert).

Hier ist eine kurze Tabelle der möglichen Werte für die möglichen Datentypen:

          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 Java ist die Java - Sprachspezifikation bestimmt die Darstellung der Datentypen.

Die Reihenfolge ist: byte8 Bit, short16 Bit, int32 Bit, long64 Bit. Alle diese Typen sind signiert , es gibt keine nicht signierten Versionen. Bei Bitmanipulationen werden die Zahlen jedoch so behandelt, als wären sie nicht vorzeichenbehaftet (dh alle Bits werden korrekt behandelt).

Der Zeichendatentyp charist 16 Bit breit, ohne Vorzeichen und enthält Zeichen mit UTF-16-Codierung (es ist jedoch möglich, eine charbeliebige vorzeichenlose 16-Bit-Ganzzahl zuzuweisen , die einen ungültigen Zeichencodepunkt darstellt).

          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
gaborsch
quelle
10
Der C-Standard spezifiziert auch Mindestwerte für INT_MAX, LONG_MAX usw.
Oliver Charlesworth
13
Java 8 hat jetzt auch Integer ohne Vorzeichen: docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Jakub Kotowski
4
Danke, @jkbkot, gut zu wissen. Es scheint zwar, dass die Darstellung noch signiert ist, aber bestimmte nicht signierte Operationen werden als Funktion implementiert. Es ist schwer, zwei unsignierte ints hinzuzufügen ...
gaborsch
5
@GaborSch In Java ist int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));Prints 2147483648and Char ein vorzeichenloser Typ
Howlger
2
@howlger Integer.MAX_VALUE + 1ist 0x80000000wegen des Überlaufs hexadezimal (und entspricht Integer.MIN_VALUE). Wenn Sie es in ein vorzeichenloses (langes) konvertieren, wird das Vorzeichenbit wie ein Wertbit behandelt 2147483648. Vielen Dank für den charHinweis. charist nicht signiert, Sie haben Recht, aber char wird nicht wirklich für Berechnungen verwendet, deshalb habe ich es von der Liste gestrichen.
Gaborsch
72

In C ist die Ganzzahl (für 32-Bit-Computer) 32-Bit und reicht von -32768 bis +32767.

Falsch. Die 32-Bit-Ganzzahl mit Vorzeichen in der 2er-Komplementdarstellung hat den Bereich -2 31 bis 2 31 -1, der gleich -2.147.483.648 bis 2.147.483.647 ist.

Kos
quelle
3
Ich habe Ihre Potenzierung korrigiert, **ist nicht einmal C und meiner Meinung nach nicht sehr klar. :)
Entspannen Sie
2
Sieht jetzt besser aus, danke! Zu viel Python, nehme ich an. Ich vermeide, ^da es normalerweise istxor
Kos
5
Ich denke, mein Punkt ist, dass C keinen Exponentiationsoperator hat und ich nicht denke, dass ein bestimmtes Stück überhaupt als Code formatiert werden sollte. :)
entspannen Sie sich
19

Eine 32-Bit-Ganzzahl reicht von -2.147.483.648 bis 2.147.483.647. Die Tatsache, dass Sie sich auf einem 32-Bit-Computer befinden, bedeutet jedoch nicht, dass Ihr CCompiler 32-Bit-Ganzzahlen verwendet.

Ivaylo Strandjev
quelle
1
Zumindest meine Kopie von Mr. Kernighan und Mr. Ritchies "Die Programmiersprache C" sagt in A4.2, dass dies intdie "natürliche Breite der Maschine" ist, die ich beim Kompilieren für 32-Bit-Maschinen als 32 Bit interpretieren würde.
Junix
7
Dies hängt vom Compiler ab, nicht von der Maschine, die ich glaube. Ich hatte zum Beispiel einen 16-Bit-Compiler auf meinem 64-Bit-Computer installiert.
Ivaylo Strandjev
Natürlich hat Ihr 16-Bit-Compiler für 16-Bit-x86-Code nur 16-Bit verwendet. Aber das war nicht mein Punkt. Selbst ein 32-Bit-x86-Prozessor, der im 16-Bit-Modus ausgeführt wird, hat nur eine native Kapazität von nur 16 Bit. Mein Punkt ist, dass die Zielplattform, die der Compiler hat, wichtig ist. Wenn Sie beispielsweise einen Compiler für Ihren 80286 haben, generieren Sie immer noch 16-Bit-Code und haben daher 16-Bit-Ganzzahlen.
Junix
2
@junix Ich glaube, das ist genau das, worauf ich in meiner Antwort hinweise. Es ist nicht das Betriebssystem, das angibt, wie viele Bits Ihre Ganzzahlen haben. Die Zielplattform ist eine Eigenschaft des Compilers, nicht des Betriebssystems, auf dem er arbeitet, oder des Prozessors, über den Sie verfügen.
Ivaylo Strandjev
Wie ich in meinem ersten Kommentar geschrieben habe. "Beim Kompilieren für 32-Bit-Maschinen sind es 32-Bit". Das OP schreibt in seinem Beitrag "die Ganzzahl (für 32-Bit-Maschine)". Soweit ich
weiß,
15

Die C-Sprachdefinition gibt Mindestbereiche für verschiedene Datentypen an. Für intist diese minimale Reichweite -32.767-32.767, ein Sinn intsein muss , mindestens 16 Bit breit. Eine Implementierung ist frei, um eine breitere bereitzustellenint Typ mit einem entsprechend breiteren Bereich . Auf dem SLES 10-Entwicklungsserver, auf dem ich arbeite, liegt der Bereich beispielsweise zwischen -2147483647 und 2137483647.

Es gibt noch einige Systeme gibt , die den Einsatz 16-Bit - intTypen (All The World Is Not A VAX x86), aber es gibt viele , dass die Verwendung 32-Bit - intTypen, und vielleicht ein paar , dass die Verwendung 64-bit.

Die C-Sprache wurde entwickelt, um auf verschiedenen Architekturen ausgeführt zu werden. Java wurde für die Ausführung in einer virtuellen Maschine entwickelt, die diese architektonischen Unterschiede verbirgt.

John Bode
quelle
Für 16-Bit-Int ist es -3276 8 bis 32767. Für 32-Bit-Int ist es -214748364 8 bis 2147483647. Der Bereich wird von -2 ^ (n Bits-1) bis + 2 ^ (n Bits-1) angegeben ) - 1.
mythicalcoder
3
@Maven: 5.2.4.2.1 - INT_MINwird angegeben als -32767. Nehmen Sie nicht die Ergänzung von zwei an.
John Bode
8

Das strikte Äquivalent von Java intist long intin C.

Bearbeiten: Wenn int32_tdefiniert, ist es das Äquivalent in Bezug auf die Genauigkeit. long intgarantieren die Präzision des Java int, da es garantiert mindestens 32 Bit groß ist.

UmNyobe
quelle
Sie haben Recht, das Äquivalent ist, int32_twenn es von Ihrem Compiler definiert wird
UmNyobe
7

Dies liegt daran, dass in C - Integer auf 32-Bit-Computern nicht 32 Bit zum Speichern verwendet werden, sondern möglicherweise auch 16 Bit. Dies hängt von der Maschine ab (implementierungsabhängig).

BlueLettuce16
quelle
1
Nun, es ist erwähnenswert, dass das typische Implementierungsverhalten "Maschinenbreite" für verwendet int. Aber limits.hhilft herauszufinden, was die genaue Wahrheit ist
Junix
3
Aber in Wirklichkeit glaube ich nicht, dass ein C-Compiler für 32 jemals ohne int als 32 Bit erstellt wurde. Der Standard kann zulassen, dass die Compiler-Implementierung von int schwachsinniger Natur ist, aber aus irgendeinem Grund möchte niemand einen schwachsinnigen C-Compiler erstellen. Der Trend geht dahin, nützliche C-Compiler zu erstellen.
Lundin
4

Tatsächlich ist die Größe in Bits der int, short, long hängt von der Compiler - Implementierung.

ZB auf meinem Ubuntu 64 Bit habe ich shortin 32Bits, wenn auf einer anderen 32bit Ubuntu Version es 16Bit ist.

Alex
quelle
2

Es ist eigentlich ganz einfach zu verstehen, Sie können es sogar mit dem Google-Rechner berechnen: Sie haben 32 Bit für ein int und Computer sind binär, daher können Sie 2 Werte pro Bit (Punkt) haben. Wenn Sie 2 ^ 32 berechnen, erhalten Sie die 4.294.967.296. Wenn Sie diese Zahl also durch 2 teilen (weil die Hälfte davon negative ganze Zahlen und die andere Hälfte positiv sind), erhalten Sie 2.147.483.648. und diese Zahl ist die größte int, die durch 32 Bit dargestellt werden kann. Wenn Sie jedoch darauf achten, dass 2.147.483.648 größer als 2.147.483.647 mal 1 ist, liegt dies daran, dass eine der Zahlen 0 darstellt, was leider genau in der Mitte 2 ^ liegt 32 ist keine ungerade Zahl, daher haben Sie nicht nur eine Zahl in der Mitte, sodass die möglichen ganzen Zahlen eine Chiffre weniger haben, während die Negative die vollständige Hälfte von 2.147.483.648 erhalten.

Und das ist es. Es kommt auf die Maschine an, nicht auf die Sprache.

Emos Turi
quelle
2
Dies ist nicht das, wonach er gefragt hat ... die Frage ist "Warum unterscheidet sich C int von Java int?"
ElectronWill
In Java hängt die Größe von int nicht von der Maschine ab.int== 32-Bit-Vorzeichen, Zweierkomplement wird durch die Java-Sprachspezifikation definiert und auf eloxierten Blättern eingraviert Unobtainium . (OK, vielleicht nicht das letzte bisschen.)
Stephen C
1

Im C-Bereich für __int32 liegt –2147483648 bis 2147483647. Die vollständigen Bereiche finden Sie hier.

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

Es gibt keine Garantie dafür, dass ein 'int' 32 Bit beträgt. Wenn Sie Variablen einer bestimmten Größe verwenden möchten, insbesondere wenn Sie Code schreiben, der Bitmanipulationen beinhaltet, sollten Sie die 'Standard Integer Types' verwenden.

In Java

Der int-Datentyp ist eine 32-Bit-Zweierkomplement-Ganzzahl mit Vorzeichen. Es hat einen Mindestwert von -2.147.483.648 und einen Höchstwert von 2.147.483.647 (einschließlich).

Achintya Jha
quelle
2
Die Werte, die Sie für C angeben, sind nur Mindestbereiche.
Oliver Charlesworth
@OliCharlesworth Bereich von minimal bis maximal.
Achintya Jha
6
Ich meine, der Bereich für jeden Typ darf größer sein als oben angegeben.
Oliver Charlesworth
3
In C gibt es nichts namens __int32. Microsoft hat keinen streng konformen C-Compiler. Wen interessiert es also, wie der Nicht-C-Compiler funktioniert? Die einzige relevante Quelle ist ISO9899, ​​entweder 5.2.4.2.1 "Größen von Ganzzahltypen" oder 7.20.2.1 "Grenzen von Ganzzahltypen mit exakter Breite". Keines davon ist mit Microsoft Goo kompatibel.
Lundin
2
C99 fügt dem Standard int32_t, int16_t usw. hinzu. Nicht 100% kompatibel mit den Ergänzungen von Microsoft, aber sie funktionieren auf ähnliche Weise.
Fragen Sie nach Monica
-1

In Standard C können Sie INT_MAX als maximalen 'int'-Wert verwenden. Diese Konstante muss in "limit.h" definiert werden. Ähnliche Konstanten sind für andere Typen definiert ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ). Wie angegeben, sind diese Konstanten implementierungsabhängig, haben jedoch einen Mindestwert gemäß den Mindestbits für jeden Typ, wie in der Norm angegeben.

Carlos UA
quelle
5
Dies führt nicht wirklich dazu, die Frage des OP zu beantworten. Außerdem sollten Kernteile einer Antwort wirklich nicht auf einer anderen Site vergraben werden.
Brad Koch