4

我试图输出以下内容但感到困惑,

    float f=3.4;
    char *cp;
    cp=(char *)&f;
    printf("%d\n",*cp);

我计算出的标准化数 IEEE 754 标准是,

0 10000000 10110011001100110011001

这就是为什么我假设现在 cp 的价值有,

10011001

转换为 2 的补码后,

01100111

它应该输出 -103 ,但我在流血事件/DevC 中得到了 -102 。为什么这样的输出???

4

2 回答 2

4

那是因为f正在四舍五入:

3.4 = 10110011001100110011001 100110011001...  (repeating 1001)

四舍五入:

3.4 = 10110011001100110011010
                            ^

当存储为单精度浮点数时。

现在,当您提取最后 8 位时,您实际上得到10011010的是10011001.

转换10011010->-102而不是-103.

于 2012-07-07T19:46:53.647 回答
2

我认为你计算错误:

Prelude> decodeFloat (3.4 :: Float)
(14260634,-22)
(0.03 secs, 2929112 bytes)
Prelude> Numeric.showHex (fst it) ""
"d9999a"

尾数以1010.

于 2012-07-07T19:46:26.843 回答