为什么vc ++的行为不像我的计算器

时间:2019-06-16 19:46:53

标签: visual-c++

我有一个简单的问题,如果我想在vc ++中添加一些十六进制值 像0x140000000和0x02F61570我的计算器说结果是 0x142f61570,但是在我的代码中,如果我将这两个数字相加,我只会得到 0x42f61570。问题可能在哪里?

除了将十六进制存储在DWORD中之外,我已经尝试了其他一些值,但是结果是相同的。

DWORD base = 0x140000000;
DWORD address = 0x02F61570;
DWORD next = base + address;
printf("0x%x\n",next);

我的代码中运算的结果是=> 0x42f61570而不是我的计算器,它表示为0x142f61570

1 个答案:

答案 0 :(得分:0)

DWORD是用于32位无符号整数的typedef,C ++中对无符号整数的操作是使用模块化算术执行的。 printf向您显示next的真实值,并且该值是使用算术模2 32 base + address的正确结果。

实际上,原始的初始化DWORD base = 0x140000000;已经减少了模2 32 的值。您的编译器没有为超出范围的常量初始化程序生成警告吗?


如果使用64位变量,则可以实现预期的输出。

DWORD64 base = 0x140000000;
DWORD address = 0x02F61570;
DWORD64 next = base + address;
printf("0x%I64x\n", next);