Размер int и float - PullRequest
       19

Размер int и float

17 голосов
/ 16 августа 2011

У меня вопрос по поводу диапазонов целых и чисел:

Если они оба имеют одинаковый размер 4 байта, почему у них разные диапазоны?

Ответы [ 6 ]

22 голосов
/ 16 августа 2011

Они совершенно разные - обычно int - это простое целое число со знаком со знаком 2, а float - это представление с плавающей запятой одинарной точности с 23 битами мантиссы, показателем 8 бит и знаком 1 бита (см. http://en.wikipedia.org/wiki/IEEE_754-2008).

14 голосов
/ 16 августа 2011

Они имеют разные диапазоны значений, потому что их содержимое интерпретируется по-разному; другими словами, они имеют разные представления .

Плавающие и двойные, как правило, представлены как что-то вроде

+-+-------+------------------------+
| |       |                        |
+-+-------+------------------------+
 ^    ^                ^
 |    |                |
 |    |                +--- significand
 |    +-- exponent
 |
 +---- sign bit

где у вас есть 1 бит для представления знака s (0 для положительного, 1 для отрицательного), некоторое количество бит для представления показателя e и оставшиеся биты для значение или дробь f . Значение представляется как s * f * 2 e .

Диапазон значений, которые могут быть представлены, определяется количеством битов в показателе степени; чем больше битов в показателе степени, тем шире диапазон возможных значений.

Точность (неофициально, размер промежутка между представимыми значениями) определяется числом битов в значимом. Не все значения с плавающей точкой могут быть представлены точно в данном количестве битов. Чем больше битов у вас в значении, тем меньше разрыв между любыми двумя представленными значениями.

Каждый бит в значении представляет 1/2 n , где n - число битов, считающихся слева:

 110100...
 ^^ ^
 || |  
 || +------ 1/2^4 = 0.0625
 || 
 |+-------- 1/2^2 = 0.25
 |
 +--------- 1/2^1 = 0.5
                    ------
                    0.8125

Вот ссылка, которую каждый должен был добавить в закладки: Что должен знать каждый учёный-компьютерщик об арифметике с плавающей точкой .

4 голосов
/ 16 августа 2011

Два типа с одинаковым размером в байтах наверняка могут иметь разные диапазоны.

Например, подписанные int и unsigned int оба равны 4 байта, но у одного из 32 бит зарезервированы для знака,который снижает максимальное значение в 2 раза по умолчанию.Кроме того, диапазон отличается, потому что тот может быть отрицательным.С другой стороны, числа с плавающей точкой теряют диапазон значений в пользу использования некоторых битов для десятичного диапазона.

1 голос
/ 16 августа 2011

Целое число - это просто число ... Его диапазон зависит от количества бит (отличается для целого со знаком или без знака).

Число с плавающей запятой - это совсем другое. Это просто соглашение о представлении числа с плавающей запятой в двоичном виде ...

Кодируется битом знака, полем экспоненты и мантиссой.

Прочитайте следующую статью:

http://www.eosgarden.com/en/articles/float/

Это позволит вам понять, что представляют собой значения с плавающей запятой, с точки зрения бинарности. Вы поймете дальность действия ...

1 голос
/ 16 августа 2011

Вы смешиваете представление числа , которое зависит от некоторых правил, которые вы (или кто-то еще) определяет, и от того, как вы используете , храните число в компьютере(байты).

Например, вы можете использовать только один бит для сохранения числа и решить, что 0 представляет -100, а 1 представляет +100.Или что 0 представляет .5 и 1 представляет 1.0.2 вещи, данные и значение данных, независимы.

1 голос
/ 16 августа 2011

Стандарт не определяет размер в байтах, но определяет минимальные диапазоны, которые должны быть в состоянии поддерживать различные целочисленные типы.Из него можно вывести минимальный размер в байтах.

Минимальные диапазоны, гарантированные стандартом (из «Целочисленных типов в C и C ++»):

signed char: -127 to 127
unsigned char: 0 to 255
"plain" char: -127 to 127 or 0 to 255 (depends on default char signedness)
signed short: -32767 to 32767
unsigned short: 0 to 65535
signed int: -32767 to 32767
unsigned int: 0 to 65535
signed long: -2147483647 to 2147483647
unsigned long: 0 to 4294967295
signed long long: -9223372036854775807 to 9223372036854775807
unsigned long long: 0 to 18446744073709551615

Фактические значения для платформы зависят от диапазонанаходится в C или в C ++ (или даже лучше, в шаблоне std :: numeric_limits в заголовке).

Стандарт требует только, чтобы:

sizeof(short int) <= sizeof(int) <= sizeof(long int)

float не имеет того же "разрешения", что и int, несмотря на их на вид схожий размер.int является дополнением 2, тогда как float состоит из 23 битов Мантиссы, 8 битов показателя степени и 1 бита знака.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...