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?
Antworten:
In C , selbst die Sprache bestimmt nicht die Darstellung bestimmter Datentypen. Es kann von Maschine zu Maschine variieren, auf eingebetteten Systemen
int
kann es 16 Bit breit sein, obwohl es normalerweise 32 Bit ist.Die einzige Voraussetzung ist, dass
short int
<=int
<=long int
nach Größe. Es gibt auch eine Empfehlung, dassint
die die native Kapazität des Prozessors darstellen sollte .Alle Typen sind signiert. Das
unsigned
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:
In Java ist die Java - Sprachspezifikation bestimmt die Darstellung der Datentypen.
Die Reihenfolge ist:
byte
8 Bit,short
16 Bit,int
32 Bit,long
64 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
char
ist 16 Bit breit, ohne Vorzeichen und enthält Zeichen mit UTF-16-Codierung (es ist jedoch möglich, einechar
beliebige vorzeichenlose 16-Bit-Ganzzahl zuzuweisen , die einen ungültigen Zeichencodepunkt darstellt).quelle
int
s hinzuzufügen ...int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));
Prints2147483648
and Char ein vorzeichenloser TypInteger.MAX_VALUE + 1
ist0x80000000
wegen des Überlaufs hexadezimal (und entsprichtInteger.MIN_VALUE
). Wenn Sie es in ein vorzeichenloses (langes) konvertieren, wird das Vorzeichenbit wie ein Wertbit behandelt2147483648
. Vielen Dank für denchar
Hinweis.char
ist nicht signiert, Sie haben Recht, aber char wird nicht wirklich für Berechnungen verwendet, deshalb habe ich es von der Liste gestrichen.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.
quelle
**
ist nicht einmal C und meiner Meinung nach nicht sehr klar. :)^
da es normalerweise istxor
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
C
Compiler 32-Bit-Ganzzahlen verwendet.quelle
int
die "natürliche Breite der Maschine" ist, die ich beim Kompilieren für 32-Bit-Maschinen als 32 Bit interpretieren würde.Die C-Sprachdefinition gibt Mindestbereiche für verschiedene Datentypen an. Für
int
ist diese minimale Reichweite -32.767-32.767, ein Sinnint
sein 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 -
int
Typen (All The World Is Not AVAXx86), aber es gibt viele , dass die Verwendung 32-Bit -int
Typen, 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.
quelle
INT_MIN
wird angegeben als-32767
. Nehmen Sie nicht die Ergänzung von zwei an.Das strikte Äquivalent von Java
int
istlong int
in C.Bearbeiten: Wenn
int32_t
definiert, ist es das Äquivalent in Bezug auf die Genauigkeit.long int
garantieren die Präzision des Javaint
, da es garantiert mindestens 32 Bit groß ist.quelle
int32_t
wenn es von Ihrem Compiler definiert wirdDies 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).
quelle
int
. Aberlimits.h
hilft herauszufinden, was die genaue Wahrheit istAuf dem Poster sind die Java-Typen verwechselt. In Java ist sein C in ein Short: Short (16 Bit) = -32768 bis 32767 Int (32 Bit) = -2.147.483.648 bis 2.147.483.647
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
quelle
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
short
in32
Bits, wenn auf einer anderen 32bit Ubuntu Version es16
Bit ist.quelle
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.
quelle
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.)Im C-Bereich für __int32 liegt –2147483648 bis 2147483647. Die vollständigen Bereiche finden Sie hier.
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).
quelle
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.
quelle