当我将变量声明为float并减去两个十六进制数时,每次编译并运行它时我都会得到不同的答案。如果我声明一个整数变量,每次编译和运行代码时结果都保持不变。我不明白为什么每次使用相同的两个数字(0xFF0000 - 0xFF7FF)的差异编译时,将结果存储在浮点更改中
int main()
{
float BlocksLeft = 0xFF0000 - 0xFF7FF;
int BLeft = 0xFF0000 - 0xFF7FF;
printf("%08x\n", BlocksLeft);
printf("%08x\n", BLeft);
}
答案 0 :(得分:4)
以下行不正确:
printf("%08x\n", BlocksLeft);
%x
格式将指示编译器您提供的参数是int。这导致未定义的行为。我试图编译你的代码,我得到了:
>gcc -Wall -Wextra -Werror -std=gnu99 -o stackoverflow.exe stackoverflow.c
stackoverflow.c: In function 'main':
stackoverflow.c:15:4: error: format '%x' expects argument of type 'unsigned int', but argument 2 has type 'double' [-Werror=format=]
printf("%08x\n", BlocksLeft);
^
请尝试使用更强的警告级别编译,至少-Wall
。
您可以通过这种方式更正您的计划,例如:
#include <stdio.h>
int main()
{
float BlocksLeft = 0xFF0000 - 0xFF7FF;
int BLeft = 0xFF0000 - 0xFF7FF;
printf("%08x\n", (int) BlocksLeft); // Works because BlocksLeft's value is non negative
// or
printf("%08x\n", (unsigned int) BlocksLeft);
// or
printf("%.8e\n", BlocksLeft);
printf("%08x\n", BLeft);
}