【发布时间】:2016-03-29 15:17:25
【问题描述】:
当我将变量声明为浮点数并减去两个十六进制数时,每次编译和运行它时都会得到不同的答案。如果我声明一个整数变量,每次编译和运行代码时结果都保持不变。我不明白为什么每次我用相同的两个数字(0xFF0000 - 0xFF7FF)的差异进行编译时,将结果存储在浮点数中会发生变化
int main()
{
float BlocksLeft = 0xFF0000 - 0xFF7FF;
int BLeft = 0xFF0000 - 0xFF7FF;
printf("%08x\n", BlocksLeft);
printf("%08x\n", BLeft);
}
【问题讨论】:
-
我正在使用这个在线编译器tutorialspoint.com/compile_c_online.php
-
浮点数不是无符号整数,因此 '%x' 是 'BlocksLeft' 的非法格式说明符,导致 UB。
-
要打印
float并查看其所有意义,请尝试printf("%.9e\n", BlocksLeft);%08x用于无符号整数。 -
您应该阅读 IEEE754 并更深入地了解
doubles,然后再尝试将它们视为仅仅是十六进制值。因为由于四舍五入,您得到的实际上是预期的行为。如果你使用double而不是float,也许你会得到更一致的行为。我提到双打是因为float只是double的一半大小。 -
@alk 网页应该启动 gcc -Wall 以及更多开箱即用的 -Wxx 选项。如果它不这样做,至少应该有一种方法让它记住你的选择。如果您不能这样做,请查找另一个在线编译器。如果有选项,很好(我在移动设备上看不到)。
标签: c hex subtraction