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


292

В C целое число (для 32-битного компьютера) составляет 32 бита, и оно варьируется от -32 768 до + 32 767. В Java целое число (long) также составляет 32 бита, но оно варьируется от -2 147 483 648 до + 2 147 483 647.

Я не понимаю, как диапазон отличается в Java, хотя количество битов одинаково. Может кто-нибудь объяснить это?


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

5
@stackuser - Несколько хороших ответов на ваш вопрос - вы должны принять один :)
Дарра Энрайт

2
@DarraghEnright его в последний раз видели в марте 2015 года, я сомневаюсь, что он вернется :(
Ungeheuer

4
@ Адриан Хаха - наверное нет! Бывает немного, наверное. Я всегда думал, что SO может легко принимать ответы автоматически при определенных условиях - там, где вопрос старше определенного возраста, OP - AWOL, и есть явно полезный ответ с большим количеством голосов.
Дарра Энрайт

2
@DarraghEnright Согласен. Но OP был здесь ~ 2 недели назад, у него был шанс принять, так что технически он не ушел.
gaborsch

Ответы:


395

В 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 теперь также есть целое число без знака: docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Якуб Котовски,

4
Спасибо, @jkbkot, приятно это знать. Хотя кажется, что представление все еще подписано, но некоторые неподписанные операции реализованы как функция. Трудно добавить два неподписанных intс ...
gaborsch

5
@GaborSch В Java типint foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo)); prints 2147483648и char - это тип без знака
howlger

2
@howlger Integer.MAX_VALUE + 1находится 0x80000000в шестнадцатеричном, из-за переполнения (и составляет Integer.MIN_VALUE). Если вы преобразуете его в unsigned (long), бит знака будет обрабатываться как бит значения, так и будет 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
По крайней мере, моя копия мистера Кернигана и мистера Ричи «Язык программирования C» говорит в A4.2, что intэто «естественная ширина машины», которую я бы интерпретировал как 32-битную при компиляции для 32-битных машин.
Junix

7
Это зависит от компилятора, а не от машины, которой я верю. Например, на моей 64-битной машине был установлен 16-битный компилятор.
Ивайло Странджев

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

2
@junix Я верю, что это именно то, что я указываю в своем ответе. Не ОС определяет, сколько битов у ваших целых чисел. Целевая платформа - это свойство компилятора, а не ОС, на которой он работает, или процессора, который у вас есть.
Ивайло Странджев

Как я написал в своем первом комментарии. «Это 32-битный при компиляции для 32-битных машин». ОП пишет в своей публикации "целое число (для 32-битной машины)". Итак, насколько я понимаю, он не имеет в виду свою ОС или свою машину, он ссылается на свою целевую платформу
junix

15

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

Есть еще некоторые системы, что там использование 16-битных intтипов (All The World Is Не VAX x86), но есть много , что использование 32-битных intтипов, и , возможно , некоторые из них , что использование 64-бит.

Язык Си был разработан для работы на разных архитектурах. 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помогает выяснить, что именно является истиной
junix

3
Но на самом деле, я не думаю, что компилятор C для 32 когда-либо создавался без 32-битных int. Стандарт может позволить реализации int компилятора иметь дебильный характер, но по какой-то причине никто не хочет создавать дебильный компилятор Си. Тенденция заключается в создании полезных компиляторов Си.
Лундин


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-битным, если вы хотите использовать переменные определенного размера, особенно при написании кода, который включает битовые манипуляции, вы должны использовать «Стандартные целочисленные типы».

На яве

Тип данных int представляет собой 32-разрядное целое число со знаком в виде двоичного числа со знаком. Он имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647 (включительно).


2
Значения, которые вы указываете для C, являются только минимальными диапазонами.
Оливер Чарльзуорт

@OliCharlesworth Диапазон, если от минимума до максимума.
Achintya Jha

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

3
В C нет ничего, что называется __int32. У Microsoft нет строго соответствующего компилятора C, так кого волнует, как работает их не-C компилятор? Единственным релевантным источником является ISO9899, ​​либо 5.2.4.2.1 «Размеры целочисленных типов», либо 7.20.2.1 «Пределы целочисленных типов точной ширины». Ни один из которых не совместим с Microsoft Goo.
Лундин

2
C99 добавляет к стандарту int32_t, int16_t и т. Д. Не на 100% совместимо с дополнениями Microsoft, но работает аналогичным образом.
Спросите о Монике

1

Это на самом деле очень просто понять, вы даже можете вычислить его с помощью калькулятора Google: у вас есть 32 бита для целых, а компьютеры двоичные, поэтому вы можете иметь 2 значения на бит (спот). если вы вычислите 2 ^ 32, вы получите 4 294 967 296. поэтому, если вы разделите это число на 2 (потому что половина из них - отрицательные целые числа, а другая половина - положительные), то вы получите 2 147 483 648. и это число является самым большим целым числом, которое может быть представлено 32 битами, хотя, если вы обратите внимание, вы заметите, что 2 147 483 648 больше, чем 2 147 483 647 на 1, это потому, что одно из чисел представляет 0, которое, к сожалению, находится посередине 2 ^ 32 не является нечётным числом, поэтому у вас нет только одного числа посередине, поэтому у целых чисел с вероятностью есть на один шифр меньше, в то время как отрицательные числа получают полную половину 2 147 483 648.

И это все. Это зависит от машины, а не от языка.


2
Это не то, что он просил ... вопрос в том, почему C int отличается от Java int?
Электрон будет

А в Java размер int не зависит от машины. int== 32-разрядная подпись, два дополнения определены спецификацией языка Java и выгравированы на листах анодированного unobtainium . (ОК, может быть, не последний бит.)
Стивен 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.