Вы загружаете целое число в регистр с плавающей запятой и ожидаете, что оно будет считаться одним и тем же значением в плавающей запятой. Это не так, как работает плавающая точка IEEE754, номера используют другую схему кодирования.
Битовая диаграмма, образованная целым числом 6580001
(0x00646701
), показана на приведенной ниже аналитической диаграмме. Число с плавающей запятой состоит из знака, предвзятого экспонента и дробной части.
seee eeee efff ffff ffff ffff ffff ffff
0000-0000 0110-0100 0110-0111 0000-0001
Прежде всего, давайте рассмотрим знак. Будучи 0
, это означает, что число положительное. Это был легкий бит :-)
Биты экспоненты равны нулю, и в кодировке IEEE754 вы обычно вычитаете смещение 127
и поднимите два на эту мощность, чтобы получить множитель.
Однако, все ноль-экспоненты обрабатываются специально (это денормализованные числа). Во-первых, нормальная практика добавления одного из бит бит (см. Ниже) не выполняется. Во-вторых, коэффициент умножается на 2-126
, а не 2-127
.
Это делает множитель 1.1754943508222875079687365372222 x 10-38
.
Для дробных битов, то, как правило, добавьте их место значений (уменьшая обратные два), но, так как это denormalised, вы пропустите добавив один:
110-0100 0110-0111 0000-0001
|| | || ||| |
|| | || ||| +- 1/8M = 0.00000011920928955078125
|| | || ||| (64K-4M)
|| | || ||+----------- 1/32K = 0.000030517578125
|| | || |+------------ 1/16K = 0.00006103515625
|| | || +------------- 1/8K = 0.0001220703125
|| | || (2K,4K)
|| | |+----------------- 1/1K = 0.0009765625
|| | +------------------ 1/512 = 0.001953125
|| | (64-256)
|| +----------------------- 1/32 = 0.03125
|| (8,16)
|+--------------------------- 1/4 = 0.25
+---------------------------- 1/2 = 0.5
0.78439342975616455078125
Чтобы получить фактическое номер , вы берете продукт этого результата и множитель, рассчитанный ранее, чтобы получить 9.2205004550049022573489420224302 x 10-39
, что является результатом, который вы видите.
Ну, вы передаете int и printTime ожидает поплавок. Они имеют разные двоичные представления. См. Здесь http://www.h-schmidt.net/FloatConverter/IEEE754.html и введите 0x646721 (ваш номер в шестнадцатеричном формате) в качестве «шестнадцатеричного представления» – Roddy
@ Roddy Очень благодарю вас. –