Размер int и float

У меня вопрос о диапазонах int и floats:

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

Ответы

Ответ 1

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

Ответ 2

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

Поплавки и удвоения обычно представлены как нечто вроде

+-+-------+------------------------+
| |       |                        |
+-+-------+------------------------+
 ^    ^                ^
 |    |                |
 |    |                +--- 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

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

Ответ 3

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

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

Ответ 4

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

Минимальные диапазоны, гарантированные стандартом (из "Целочисленные типы в 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 или С++ (или даже лучше, в шаблоне std:: numeric_limits в заголовке).

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

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