В моей архитектуре CentOS 7 Intel 64 sizeof (float) равен 4. Столь малый порядковый результат, который я вижу в моем тесте 00 00 C8 C1, является отрицательным числом.Представление Intel с плавающей запятой одинарной точности:
1 bit sign
8 bit exponent
23 bit significand (with the first 1 bit implied)
Поскольку архитектура Intel имеет младший порядок, значение с плавающей запятой для 00 00 C8 C1 равно 1100 0001 1100 1000 0000 0000 0000 0000
.Первая 1 означает, что число отрицательное.Следующие 8 битов 10000011
(десятичный 131) - это показатель степени, а следующие 4 бита 1001
с подразумеваемым 1 битом 11001
- это число 25, сдвинутое вправо на 4 бита.Показатель 131 смещен от 127 на 4, что является числом битов, которое 1.1001
сдвигается влево, чтобы вернуться к 25.
В 64-разрядном представлении показатель равен 11 битам, исмещение экспоненты равно 1023. Таким образом, можно ожидать, что число будет 1 (отрицательный знак), десятичное 1027 в 11 битах 100 0000 0011
, затем 25 десятичных как 1001
с подразумеваемым ведущим 1 битом (как в версии с одинарной точностью),тогда все нули, которые вместе составляют C0 39 00 00 , 00 00 00 00
.Вы можете видеть, что последние 4 байта - все нули.Но это все еще little-endian, так что 64-битное число будет выглядеть как 00 00 00 00 00 00 39 C0
.Таким образом, вы получаете все нули, если печатаете первые 4 байта.
Вы могли бы видеть ненулевые значения из вашей программы, либо (a) указав в объявлении массив из 8 символов и напечатав все 8 (и выувидели бы два байта с 39 C0) или (b) использование значения, отличного от -25, в вашем тесте, для которого требуется больше двоичных цифр для представления в виде большого простого числа или иррационального числа (как предложено @David C. Rankin).
Проверка sizeof (float) определит, какой у вас размер с плавающей запятой (в байтах), и я ожидаю, что вы увидите его как 8, потому что вы видите нули, а не C8 C1
, как я.