我有一个简单的问题,如果我想在vc ++中添加一些十六进制值 像0x140000000和0x02F61570我的计算器说结果是 0x142f61570,但是在我的代码中,如果我将这两个数字相加,我只会得到 0x42f61570。问题可能在哪里?
除了将十六进制存储在DWORD中之外,我已经尝试了其他一些值,但是结果是相同的。
DWORD base = 0x140000000;
DWORD address = 0x02F61570;
DWORD next = base + address;
printf("0x%x\n",next);
我的代码中运算的结果是=> 0x42f61570而不是我的计算器,它表示为0x142f61570
答案 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);