Ответ 1
Они совершенно разные - обычно int
- просто однозначное целое число со знаком 2, а float
- одноточечное представление с плавающей точкой с 23 битами мантиссы, 8 бит и 1 бит (см. http://en.wikipedia.org/wiki/IEEE_754-2008).
У меня вопрос о диапазонах int и floats:
Если они оба имеют размер 4 байта, почему у них разные диапазоны?
Они совершенно разные - обычно int
- просто однозначное целое число со знаком 2, а float
- одноточечное представление с плавающей точкой с 23 битами мантиссы, 8 бит и 1 бит (см. http://en.wikipedia.org/wiki/IEEE_754-2008).
У них разные диапазоны значений, потому что их содержимое интерпретируется по-разному; другими словами, они имеют разные представления.
Поплавки и удвоения обычно представлены как нечто вроде
+-+-------+------------------------+
| | | |
+-+-------+------------------------+
^ ^ ^
| | |
| | +--- 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
Здесь каждая ссылка должна быть отмечена закладкой: Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой.
Два типа с одинаковым размером в байтах могут иметь разные диапазоны.
Например, подписанные int и unsigned int являются как 4 байтами, но один из его 32 бит зарезервирован для знака, который по умолчанию снижает максимальное значение в 2 раза. Кроме того, диапазон отличается, потому что он может быть отрицательным. Поплавки, с другой стороны, теряют диапазон значений в пользу использования некоторых бит для десятичного диапазона.
В стандарте не указывается размер в байтах, но он указывает минимальные диапазоны, которые должны быть удержаны различными интегральными типами. Вы можете вывести из него минимальный размер в байтах.
Минимальные диапазоны, гарантированные стандартом (из "Целочисленные типы в 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 бит знака.
Вы смешиваете представление числа, которое зависит от некоторых правил, которые вы (или кого-то еще) задаете, и того, как вы используете сохранить номер в компьютер (байты).
Например, вы можете использовать только один бит, чтобы сохранить номер, и решили, что 0
представляет -100, а 1
представляет +100. Или что 0
представляет .5 и 1
представляет 1.0. 2 вещи, данные и смысл данных независимы.
Целое число - это просто число... Диапазон зависит от количества бит (различного для подписанного или беззнакового целого).
Число с плавающей запятой - это совсем другое. Это просто соглашение о представлении числа с плавающей запятой в двоичном формате...
Он закодирован знаковым битом, полем экспоненты и мантиссой.
Прочитайте следующую статью:
http://www.eosgarden.com/en/articles/float/
Это позволит вам понять, что такое значения с плавающей запятой, с двоичной перспективы. Вы поймете предмет диапазона...