максимальне значення цілого числа


291

У C ціле число (для 32-бітної машини) становить 32 біти, і воно становить від -32,768 до +32,767. У Java ціле число (довге) також становить 32 біти, але становить від -2,147,483,648 до +2,147,483,647.

Я не розумію, чим діапазон відрізняється у Java, хоча кількість бітів однакова. Хтось може це пояснити?


35
Щоб отримати максимальні та мінімальні значення int на Java, використовуйте Integer.MAX_VALUE та Integer.MIN_VALUE
live-love

5
@stackuser - кілька хороших відповідей на ваше запитання - ви повинні прийняти один :)
Darragh Enright

2
@DarraghEnright його востаннє бачили в березні 2015 року, я сумніваюся, що він повертається :(
Ungeheuer

4
@ Адріан ха-ха - гадаю, ні! Трапляється трохи, я думаю. Я завжди уявляв, що ТАК може легко приймати відповіді за певних умов - там, де питання закінчується певний вік, ОП є AWOL і є явно корисна відповідь з великою кількістю відгуків.
Darragh Enright

2
@DarraghEnright Погоджуюся. Але ОП був тут ~ 2 тижні тому, він мав шанс прийняти, так що технічно він не відійшов.
gaborsch

Відповіді:


394

У 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

В Java , Специфікація мови Java визначає уявлення типів даних.

Порядок: byte8 біт, short16 біт, int32 біт, long64 біт. Усі ці типи підписані , версії не підписані. Однак бітові маніпуляції розглядають числа як непідписані (тобто правильно обробляти всі біти).

Тип даних символів charшириною 16 біт, непідписаний і містить символи, використовуючи кодування 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 тощо.
Олівер

13
Java 8 тепер також не підписала
Якуб Котовський,

4
Дякую, @jkbkot, добре це знати. Хоча здається, що представлення все ще підписане, але певні неподписані операції реалізуються як функція. Важко додати два int
неподписані

5
@GaborSch На Яві int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));принти 2147483648та char - це
неподписаний

2
@howlger Integer.MAX_VALUE + 1знаходиться 0x80000000в шістнадцятковій частині через переповнення (і дорівнює Integer.MIN_VALUE). Якщо ви перетворите його на непідписаний (довгий), біт знаків буде трактуватися як біт значення, так і буде 2147483648. Дякую за charзаписку. charне підписано, ви маєте рацію, але char не використовується для розрахунків, тому я залишив його зі списку.
gaborsch

73

У C ціле число (для 32-бітної машини) становить 32 біт і становить від -32768 до +32767.

Неправильно. 32-розрядне ціле число в представленні комплементу 2 має діапазон від -2 31 до 2 31 -1, що дорівнює -2,147,483,648 до 2,147,483,647.


3
Я виправив ваше експоненцію, **навіть це не C і не дуже зрозуміло, на мою думку. :)
розмотайте

2
Зараз краще виглядає, дякую! Дуже багато Python, я думаю. Я уникаю, ^оскільки це зазвичайxor
Кос

5
Я думаю, що моя думка полягає в тому, що оскільки C не має оператора експоненції, я не думаю, що цей фрагмент взагалі повинен бути форматований як код. :)
розмотуй

19

32-бітове ціле число коливається від -2,147,483,648 до 2,147,483,647. Однак той факт, що ви знаходитесь на 32-бітній машині, не означає, що ваш Cкомпілятор використовує 32-бітні цілі числа.


1
Принаймні моя копія містера Кернігана та містера Рітчі "Мова програмування на С" говорить у форматі A4.2, що intє "природною шириною машини", яку я б інтерпретував як 32 біти при компілюванні для 32-бітових машин.
липень

7
Це залежить від компілятора, а не від машини, в яку я вірю. Наприклад, у мене на моїй 64-бітній машині встановлений 16-бітний компілятор.
Івайло Страндєв

Звичайно, ваш 16-розрядний компілятор для 16-бітного коду x86 використовував лише 16 біт. Але це не було моєю суттю. Навіть 32-бітний процесор x86, що працює в 16-бітному режимі, має лише 16-бітну ємність. Думаю, що цільова платформа компілятора має значення. Наприклад, якщо у вас є компілятор для вашого 80286, ви все одно будете генерувати 16-бітний код і, отже, матимете 16-бітові цілі числа.
липень

2
@junix Я вважаю, що саме на це я і вказую у своїй відповіді. Це не ОС, яка визначає, скільки бітів мають ваші цілі числа. Цільова платформа - це властивість компілятора, а не ОС, на якій він працює, або процесора, який у вас є.
Івайло Страндєв

Як я написав у своєму першому коментарі. "Це 32-біт при компілюванні для 32-бітних машин". ОП пише у своєму дописі "ціле число (для 32-бітної машини)" Отже, з того, що я розумію, він не має на увазі свою ОС або свою машину, він має на увазі свою цільову платформу
липень

15

Визначення мови С визначає мінімальні діапазони для різних типів даних. Оскільки intцей мінімальний діапазон становить від -32767 до 32767, тобто ширина intмає бути не менше 16 біт. Реалізація вільна, щоб надати ширшого intтипу із відповідно ширшим діапазоном. Наприклад, на сервері розробки SLES 10, над яким я працюю, діапазон становить від -2147483647 до 2137483647.

Є ще деякі системи, які використовують 16-бітні intтипи (All The World Is Not A VAX x86), але є багато тих, хто використовує 32-бітні intтипи, а може бути декілька, які використовують 64-бітні.

Мова C була розроблена для роботи в різних архітектурах. Java була розроблена для роботи у віртуальній машині, яка приховує ці архітектурні відмінності.


Для 16-бітових int він становить -3276 8 до 32767. Для 32-розрядних int це -214748364 8 до 2147483647. Діапазон вказаний від -2 ^ (n біт-1) до + 2 ^ (n біт-1 ) - 1.
міфічнийкодер

3
@Maven: 5.2.4.2.1 - INT_MINвказано як -32767. Не припускайте доповнення двох.
Джон Боде

8

Суворий еквівалент java intзнаходиться long intв C.

Правка: Якщо int32_tвизначено, то це еквівалент з точки зору точності. long intгарантувати точність Java int, оскільки вона гарантує розмір не менше 32 біт.


ви маєте рацію, еквівалент, int32_tякщо це визначено вашим компілятором
UmNyobe,

7

Це тому, що в C - цілому на 32-бітній машині не означає, що для його зберігання використовуються 32 біти, це може бути і 16 біт. Це залежить від машини (залежно від реалізації).


1
Ну, варто зазначити, що типова поведінка впровадження використовує "машинну ширину" для int. Але limits.hдопомагає з’ясувати, яка точна правда
вернок

3
Але насправді я не думаю, що компілятор C для 32 ніколи не робився без int як 32 біта. Стандарт може дозволити реалізації компілятора int бути дебільним, але чомусь ніхто не хоче робити компілятор moronic C. Тенденція - робити корисні компілятори C.
Лундін


4

На насправді розмір в бітах int, short, long залежить від реалізації компілятора.

Наприклад , на моєму Ubuntu 64 біт у мене є shortв 32бітах, коли на іншою версією один 32bit Ubuntu це 16небагато.


1

Діапазон C для __int32 становить від -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,147,483,648 і максимальне значення 2,147,483,647 (включно).


2
Значення, які ви цитуєте для C, - це лише мінімальні діапазони.
Олівер Чарльзворт,

Діапазон @OliCharlesworth, якщо від мінімального до максимального.
Ачінтія Джа

6
Я маю на увазі, що діапазон для кожного типу може бути більшим, ніж те, що ви цитували вище.
Олівер Чарльзворт,

3
У C немає нічого, що називається __int32. Microsoft не має строго відповідного компілятора C, тож хто переймається тим, як працює їх компілятор, що не стосується C? Єдиним відповідним джерелом є ISO9899, ​​або 5.2.4.2.1 "Розміри цілих чисел", або 7.20.2.1 "Межі цілочисельних типів точної ширини". Жодне з яких не сумісне з goo Microsoft.
Лундін

2
C99 додає в стандарт int32_t, int16_t тощо. Не на 100% сумісний з додатками Microsoft, але вони працюють аналогічно.
Запитуйте про Моніку

1

Це насправді дуже просто зрозуміти, ви навіть можете обчислити його за допомогою калькулятора google: у вас є 32 біти для int, а комп'ютери - двійкові, тому ви можете мати 2 значення на біт (spot). якщо обчислити 2 ^ 32, ви отримаєте 4,294,967,296. тож якщо ви розділите це число на 2, (оскільки половина з них від’ємні цілі числа, а друга половина - додатні), то ви отримаєте 2,147,483,648. і це число є найбільшим int, яке може бути представлене 32 бітами, хоча якщо ви звернете увагу, ви помітите, що 2,147,483,648 більше, ніж 2,147,483,647 на 1, це тому, що одне з чисел представляє 0, яке знаходиться посередині, на жаль, 2 ^ 32 не є непарним числом, тому у вас немає лише одного числа в середині, тож у позитивних цілих чисел є один менший шифр, тоді як негативи отримують повну половину 2,147,483,648.

І це все. Це залежить від машини, а не від мови.


2
Це не те, про що він питав ... питання "чому C int відрізняється від Java int?"
ElectronWill

А в Java розмір int не залежить від машини. int== 32-розрядний підпис, доповнення двох визначається специфікацією мови Java та вигравірувано на аркушах анодованого бездокумента . (Гаразд, може, не останній шматочок.)
Стівен C

-1

у стандартному C ви можете використовувати INT_MAX як максимальне значення 'int', ця константа повинна бути визначена у "limit.h". Подібні константи визначені для інших типів ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ), як зазначено, ці константи залежать від реалізації, але мають мінімальне значення відповідно до мінімальних бітів для кожного типу, як зазначено в стандарті.


5
Це насправді не обходиться вирішенням питання ОП. Також основні частини відповіді дійсно не повинні бути поховані на іншому сайті.
Бред Кох
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.