maksymalna wartość liczby całkowitej

291

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ć?

stackuser
źródło
35
Aby uzyskać maksymalne i minimalne wartości int w Javie, użyj Integer.MAX_VALUE i Integer.MIN_VALUE
live-love
5
@stackuser - Kilka dobrych odpowiedzi na twoje pytanie - powinieneś je zaakceptować :)
Darragh Enright
2
@DarraghEnright był ostatnio widziany w marcu 2015 r., Wątpię, żeby wrócił :(
Ungeheuer
4
@Adrian haha ​​- Chyba nie! Zdarza się trochę. Zawsze wyobrażałem sobie, że SO może z łatwością automatycznie zaakceptować odpowiedzi pod pewnymi warunkami - tam, gdzie pytanie jest powyżej pewnego wieku, OP jest AWOL i istnieje wyraźnie przydatna odpowiedź z dużą liczbą pozytywnych opinii.
Darragh Enright
2
@DarraghEnright Zgadzam się. Ale OP był tutaj ~ 2 tygodnie temu, miał okazję to zaakceptować, więc technicznie go nie ma.
gaborsch

Odpowiedzi:

394

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 intmoże mieć 16 bitów szerokości, choć zwykle jest to 32 bity.

Jedynym wymaganiem jest short int<= int<= long intwedług wielkości. Istnieje również zalecenie, które intpowinno reprezentować natywną pojemność procesora .

Wszystkie typy są podpisane. unsignedModyfikator 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:

          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

W Javie , języka Java Specyfikacja określa reprezentację typów danych.

Kolejność jest następująca: byte8 bitów, short16 bitów, int32 bity, long64 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 charma szerokość 16 bitów, jest bez znaku i zawiera znaki przy użyciu kodowania UTF-16 (można jednak przypisać chardowolną 16-bitową liczbę całkowitą bez znaku, która reprezentuje nieprawidłowy znak kodowy)

          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
źródło
10
Norma C określa również minimalne wartości dla INT_MAX, LONG_MAX itp.
Oliver Charlesworth
13
Java 8 ma teraz także liczbę całkowitą bez znaku: docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Jakub Kotowski
4
Dzięki, @jkbkot, dobrze to wiedzieć. Chociaż wydaje się, że reprezentacja jest nadal podpisana, ale pewne niepodpisane operacje są implementowane jako funkcja. Trudno dodać dwa niepodpisane ints ...
gaborsch
5
@GaborSch W Javie, int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));print 2147483648i char to typ bez znaku
wycie
2
@ howlger Integer.MAX_VALUE + 1jest 0x80000000w trybie szesnastkowym z powodu przepełnienia (i jest równy Integer.MIN_VALUE). Jeśli przekonwertujesz go na niepodpisany (długi), bit znaku będzie traktowany jak bit wartości, więc tak będzie 2147483648. Dziękuję za charnotatkę. charjest niepodpisany, masz rację, ale char nie jest tak naprawdę używany do obliczeń, dlatego zostawiłem go z listy.
gaborsch
73

W C liczba całkowita (dla maszyny 32-bitowej) wynosi 32 bity i wynosi od -32768 do +32767.

Ź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.

Kos
źródło
3
Naprawiłem potęgowanie, **nie jest nawet C i moim zdaniem nie jest bardzo jasne. :)
zrelaksuj się
2
Teraz wygląda lepiej, dzięki! Myślę, że za dużo Pythona. Unikam, ^ponieważ zwyklexor
Kos
5
Myślę, że chodzi mi o to, że ponieważ C nie ma operatora potęgowania, nie sądzę, aby ten konkretny kawałek w ogóle był sformatowany jako kod. :)
odpręż się
19

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 Ckompilator używa 32-bitowych liczb całkowitych.

Ivaylo Strandjev
źródło
1
Przynajmniej moja kopia pana Kernighana i pana Ritchiesa „Język programowania C” mówi w A4.2, że intma „naturalną szerokość maszyny”, którą interpretowałbym jako 32 bity podczas kompilacji dla maszyn 32-bitowych.
junix
7
To zależy od kompilatora, a nie od maszyny, w którą wierzę. Na przykład na moim 64-bitowym komputerze zainstalowałem 16-bitowy kompilator.
Ivaylo Strandjev
Oczywiście twój 16-bitowy kompilator dla 16-bitowego kodu x86 używał tylko 16 bitów. Ale nie o to mi chodziło. Nawet 32-bitowy procesor x86 działający w trybie 16-bitowym ma tylko natywną pojemność wynoszącą tylko 16 bitów. Chodzi mi o to, że platforma docelowa kompilatora ma znaczenie. Np. Jeśli masz kompilator dla swojego 80286, nadal będziesz generować 16-bitowy kod, a zatem będziesz miał 16-bitowe liczby całkowite.
junix,
2
@junix Uważam, że dokładnie to wskazuję w mojej odpowiedzi. To nie system operacyjny określa, ile bitów mają liczby całkowite. Platforma docelowa jest własnością kompilatora, a nie systemu operacyjnego, na którym działa, ani posiadanego procesora.
Ivaylo Strandjev
Jak napisałem w moim pierwszym komentarzu. „Jest 32-bitowy podczas kompilacji dla maszyn 32-bitowych”. OP pisze w swoim wpisie „liczba całkowita (dla maszyny 32-bitowej)”. Z tego, co rozumiem, nie odnosi się on do swojego systemu operacyjnego lub maszyny, odnosi się do swojej platformy docelowej
2013
15

Definicja języka C określa minimalne zakresy dla różnych typów danych. Na intten zakres minimum jest -32767 do 32767 oznaczającą intmusi być co najmniej 16-bitowe. Implementacja jest darmowa, aby zapewnić szerszy inttyp 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ą inttypów 16-bitowych (All The World Is Not A VAX x86), ale jest wiele takich, które używają inttypó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.

John Bode
źródło
W przypadku int 16-bitowych wynosi od -3276 8 do 32767. W przypadku int 32-bitowych wynosi od -214748364 8 do 2147483647. Zakres jest określony od -2 ^ (n bitów-1) do + 2 ^ (n bitów-1 ) - 1.
mityczny
3
@Maven: 5.2.4.2.1 - INT_MINjest określony jako -32767. Nie zakładaj uzupełnienia dwóch.
John Bode
8

Dokładny odpowiednik java intznajduje się long intw C.

Edycja: Jeśli int32_tjest zdefiniowany, to jest równoważny pod względem precyzji. long intgwarantuje precyzję java int, ponieważ gwarantuje, że ma co najmniej 32 bity.

UmNyobe
źródło
masz rację, odpowiednik jest, int32_tjeśli jest zdefiniowany przez twój kompilator
UmNyobe
7

To 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).

BlueLettuce16
źródło
1
Warto zauważyć, że typowym zachowaniem implementacyjnym jest użycie „szerokości maszyny” dla int. Ale limits.hpomaga dowiedzieć się, jaka jest dokładna prawda
junix
3
Ale w rzeczywistości nie sądzę, aby kompilator C dla 32 był kiedykolwiek produkowany bez 32 bitów. Standard może zezwalać na to, że implementacja int ma charakter kretyński, ale z jakiegoś powodu nikt nie chce tworzyć kretyńskiego kompilatora C. Trend polega na tworzeniu użytecznych kompilatorów C.
Lundin
4

Właściwie wielkość w bitom int, short, long zależy od implementacji kompilatora.

Np na moim Ubuntu 64 bit mam shortw 32bitach, gdy na innej wersji Ubuntu 32bit jeden jest 16nieco.

Alex
źródło
1

W zakresie C dla __int32 wynosi –2147483648 do 2147483647. Zobacz pełne zakresy.

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

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).

Achintya Jha
źródło
2
Podane przez Ciebie wartości dla C są tylko minimalnymi zakresami.
Oliver Charlesworth
@OliCharlesworth Range, jeśli od minimum do maksimum.
Achintya Jha
6
Chodzi mi o to, że zakres dla każdego typu może być większy niż to, co cytowałeś powyżej.
Oliver Charlesworth
3
W C nie ma nic o nazwie __int32. Microsoft nie ma ściśle zgodnego kompilatora C, więc kogo obchodzi, jak działa jego kompilator inny niż C? Jedynym istotnym źródłem jest ISO9899, ​​albo 5.2.4.2.1 „Rozmiary typów liczb całkowitych” lub 7.20.2.1 „Granice typów liczb całkowitych o pełnej szerokości”. Żaden z nich nie jest zgodny z Microsoft Goo.
Lundin
2
C99 dodaje do normy int32_t, int16_t itp. Nie w 100% kompatybilny z dodatkami Microsoftu, ale działają one w podobny sposób.
Zapytaj o Monikę
1

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.

Emos Turi
źródło
2
Nie o to prosił ... pytanie brzmi: „dlaczego C int różni się od Java int?”
ElectronWill
W Javie rozmiar 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.)
Stephen C
-1

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.

Carlos UA
źródło
5
To tak naprawdę nie zajmuje się odpowiedzią na pytanie PO. Ponadto głównych części odpowiedzi naprawdę nie należy chować w innej witrynie.
Brad Koch