减去十六进制

时间:2016-03-29 15:17:25

标签: c hex subtraction

当我将变量声明为float并减去两个十六进制数时,每次编译并运行它时我都会得到不同的答案。如果我声明一个整数变量,每次编译和运行代码时结果都保持不变。我不明白为什么每次使用相同的两个数字(0xFF0000 - 0xFF7FF)的差异编译时,将结果存储在浮点更改中

int main()
{
   float BlocksLeft = 0xFF0000 - 0xFF7FF;
   int BLeft = 0xFF0000 - 0xFF7FF;

   printf("%08x\n", BlocksLeft);
   printf("%08x\n", BLeft);
}

1 个答案:

答案 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);
}