W C liczba całkowita (dla maszyny 32-bitowej) wynosi 32 bity i wynosi od -32 768 do + 32 767. W Javie liczba całkowita (długa) ma również 32 bity, ale mieści się w zakresie od -2 147 483 648 do +14 147 483 647.
Nie rozumiem, jak różni się zasięg w Javie, mimo że liczba bitów jest taka sama. Czy ktoś może to wyjaśnić?
Odpowiedzi:
W C , sam język nie określa reprezentację pewnych typów danych. Może różnić się w zależności od maszyny, w systemach wbudowanych
int
może mieć 16 bitów szerokości, choć zwykle jest to 32 bity.Jedynym wymaganiem jest
short int
<=int
<=long int
według wielkości. Istnieje również zalecenie, któreint
powinno reprezentować natywną pojemność procesora .Wszystkie typy są podpisane.
unsigned
Modyfikator pozwala używać najwyższy bit jako część wartości (w przeciwnym razie jest ona zarezerwowana dla bitem znaku).Oto krótka tabela możliwych wartości dla możliwych typów danych:
W Javie , języka Java Specyfikacja określa reprezentację typów danych.
Kolejność jest następująca:
byte
8 bitów,short
16 bitów,int
32 bity,long
64 bity. Wszystkie te typy są podpisane , nie ma niepodpisanych wersji. Jednak manipulowanie bitami traktuje liczby tak, jak były niepodpisane (to znaczy, że poprawnie obsługuje wszystkie bity).Typ danych znaków
char
ma szerokość 16 bitów, jest bez znaku i zawiera znaki przy użyciu kodowania UTF-16 (można jednak przypisaćchar
dowolną 16-bitową liczbę całkowitą bez znaku, która reprezentuje nieprawidłowy znak kodowy)źródło
int
s ...int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));
print2147483648
i char to typ bez znakuInteger.MAX_VALUE + 1
jest0x80000000
w trybie szesnastkowym z powodu przepełnienia (i jest równyInteger.MIN_VALUE
). Jeśli przekonwertujesz go na niepodpisany (długi), bit znaku będzie traktowany jak bit wartości, więc tak będzie2147483648
. Dziękuję zachar
notatkę.char
jest niepodpisany, masz rację, ale char nie jest tak naprawdę używany do obliczeń, dlatego zostawiłem go z listy.Źle. 32-bitowa liczba całkowita ze znakiem w reprezentacji uzupełnienia 2 ma zakres -2 31 do 2 31 -1, co jest równe -2 147 483 648 do 2 147 483 647.
źródło
**
nie jest nawet C i moim zdaniem nie jest bardzo jasne. :)^
ponieważ zwyklexor
32-bitowa liczba całkowita wynosi od -2 147 483 648 do 2 147 483 647. Jednak fakt, że korzystasz z komputera 32-bitowego, nie oznacza, że Twój
C
kompilator używa 32-bitowych liczb całkowitych.źródło
int
ma „naturalną szerokość maszyny”, którą interpretowałbym jako 32 bity podczas kompilacji dla maszyn 32-bitowych.Definicja języka C określa minimalne zakresy dla różnych typów danych. Na
int
ten zakres minimum jest -32767 do 32767 oznaczającąint
musi być co najmniej 16-bitowe. Implementacja jest darmowa, aby zapewnić szerszyint
typ o odpowiednio szerszym zakresie. Na przykład na serwerze programistycznym SLES 10, na którym pracuję, zakres wynosi od -2147483647 do 2137483647.Nadal istnieje kilka systemów, które używają
int
typów 16-bitowych (All The World Is Not AVAXx86), ale jest wiele takich, które używająint
typów 32-bitowych , a być może kilka używa 64-bitowych.Język C został zaprojektowany do pracy na różnych architekturach. Java została zaprojektowana do działania na maszynie wirtualnej, która ukrywa te różnice architektoniczne.
źródło
INT_MIN
jest określony jako-32767
. Nie zakładaj uzupełnienia dwóch.Dokładny odpowiednik java
int
znajduje sięlong int
w C.Edycja: Jeśli
int32_t
jest zdefiniowany, to jest równoważny pod względem precyzji.long int
gwarantuje precyzję javaint
, ponieważ gwarantuje, że ma co najmniej 32 bity.źródło
int32_t
jeśli jest zdefiniowany przez twój kompilatorTo dlatego, że w C - liczba całkowita na maszynie 32-bitowej nie oznacza, że 32 bity są używane do przechowywania, może to być również 16 bitów. To zależy od maszyny (w zależności od implementacji).
źródło
int
. Alelimits.h
pomaga dowiedzieć się, jaka jest dokładna prawdaPlakat ma pomieszane typy java. w java jego C in jest krótkie: krótkie (16 bitów) = -32768 do 32767 int (32 bity) = -2,147,483,648 do 2 147 483 647
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
źródło
Właściwie wielkość w bitom
int
,short
,long
zależy od implementacji kompilatora.Np na moim Ubuntu 64 bit mam
short
w32
bitach, gdy na innej wersji Ubuntu 32bit jeden jest16
nieco.źródło
W zakresie C dla __int32 wynosi –2147483648 do 2147483647. Zobacz pełne zakresy.
Nie ma gwarancji, że „int” będzie mieć 32 bity, jeśli chcesz używać zmiennych o określonym rozmiarze, szczególnie przy pisaniu kodu, który wymaga manipulacji bitami, powinieneś użyć „Standardowych Typów Całkowitych”.
W Javie
Typ danych int to 32-bitowa liczba całkowita ze znakiem uzupełnienia do dwóch. Ma minimalną wartość -2 147 483 648 i maksymalną wartość 2 147 483 647 (włącznie).
źródło
Jest to naprawdę bardzo łatwe do zrozumienia, możesz nawet obliczyć go za pomocą kalkulatora Google: masz 32 bity na int, a komputery są binarne, dlatego możesz mieć 2 wartości na bit (punkt). jeśli obliczysz 2 ^ 32, otrzymasz 4,294,967,296. więc jeśli podzielisz tę liczbę przez 2, (ponieważ połowa z nich jest liczbami całkowitymi ujemnymi, a druga połowa jest dodatnimi), otrzymujesz 2 147 483 648. i ta liczba jest największą liczbą całkowitą, która może być reprezentowana przez 32 bity, chociaż jeśli zwrócisz uwagę, zauważysz, że 2 147 483 648 jest większa niż 2 147 483 647 na 1, to dlatego, że jedna z liczb reprezentuje 0, która jest w środku niestety 2 ^ 32 nie jest liczbą nieparzystą, dlatego nie masz tylko jednej liczby na środku, więc liczby całkowite dodatnie mają o jeden mniejszy szyfr, podczas gdy negatywy otrzymują pełną połowę 2 147 483 648.
I to wszystko. Zależy to od maszyny, a nie od języka.
źródło
int
nie zależy od komputera.int
== 32-bitowy podpis, uzupełnienie dwójki jest określone przez specyfikację języka Java i wygrawerowane na arkuszach anodowanego unobtainium . (OK, może nie ostatni.)w standardowym C można użyć INT_MAX jako maksymalnej wartości „int”, ta stała musi być zdefiniowana w „limit.h”. Podobne stałe są zdefiniowane dla innych typów ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ), jak wspomniano, te stałe są zależne od implementacji, ale mają minimalną wartość zgodnie z minimalnymi bitami dla każdego typu, jak określono w normie.
źródło