【发布时间】:2021-09-25 12:14:50
【问题描述】:
我是 C 语言的新手。今天在学习浮点数的时候,发现了以下问题。
float TEST= 3.0f;
printf("%x\n",TEST);
printf("%d\n",TEST);
第一个输出:
9c9e82a0
-1667333472
第二个输出:
61ea32a0
1642738336
如上图,每次执行都会输出不同的结果。我检查了很多 IEEE 754 格式,但仍然不明白原因。想请问有没有人能解释一下或者提供关键字供我学习,谢谢。
-----------------------------------编辑----------- ------------------------------------
感谢您的回复。我知道如何打印 IEEE 754 位模式。但是,正如 Nate Eldredge chux-Reinstate Monica 所说,在 printf 中使用 %x 和 %d 是未定义的行为。如果我们的设备中没有浮点寄存器,它是如何工作的?这在 C99 规范中有描述吗?
【问题讨论】:
-
这是 C 中未定义的行为。如果您想检查
float的十六进制表示,您需要将memcpy之类的操作转换为uint32_t。 -
特别是,在许多实现中,浮点和整数参数是在单独的寄存器中传递的,因此您在整数寄存器中打印出一些与
3.0f完全无关的值这是在一个浮点寄存器中。 -
粉丝 Harry,使用
%g、%e、%a或%f打印浮点值,而不是%x、%d。后两者导致未定义的行为。%a将有助于查看 IEEE 754 格式。 -
都错了:请尝试
printf("%f\n",TEST); -
"如果我们的设备中没有浮点寄存器,它是如何工作的?" “这在 C99 规范中有描述吗?” --> C 没有详细说明。这取决于实施。