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

292

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

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

stackuser
источник
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
gaborsch
источник
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 бит.

UmNyobe
источник
вы правы, эквивалентен, int32_tесли он определен вашим компилятором
UmNyobe
7

Это потому, что в C - целое число на 32-битной машине не означает, что для его хранения используются 32 бита, это может быть и 16-битный код. Это зависит от машины (зависит от реализации).

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

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

Например , на моем Ubuntu 64 бит у меня есть shortв 32битах, когда на другой версии один 32bit Ubuntu это 16немного.

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

Карлос UA
источник
5
Это на самом деле не доходит до решения вопроса ОП. Кроме того, основные части ответа действительно не должны быть похоронены на другом сайте.
Брэд Кох