首页 > 解决方案 > 为什么 vc++ 的行为不像我的计算器

问题描述

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

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

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

我的代码中的操作结果是 => 0x42f61570 而不是我的计算器,它说 0x142f61570

标签: visual-c++

解决方案


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

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


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

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

推荐阅读