visual-c++ - 为什么 vc++ 的行为不像我的计算器
问题描述
我有一个简单的问题。如果我想在 vc++ 中添加一些十六进制值,例如 0x140000000 和 0x02F61570,我的计算器说结果是 0x142f61570,但是在我的代码中,如果我添加这两个数字,我只会得到 0x42f61570。问题可能出在哪里?
除了将十六进制存储在 DWORD 中之外,我已经尝试过其他一些值,但结果是一样的。
DWORD base = 0x140000000;
DWORD address = 0x02F61570;
DWORD next = base + address;
printf("0x%x\n",next);
我的代码中的操作结果是 => 0x42f61570 而不是我的计算器,它说 0x142f61570
解决方案
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);
推荐阅读
- python - 通过检查多个条件更改 Pandas 列值
- c - 为什么下面代码中的 printf 语句打印的是值而不是垃圾值?
- python - Pandas - 数据帧分组 Id 的时间序列多个切片
- scikit-learn - 如何处理将 xgboost 转换为 pmml 的空值?
- tensorflow - 在 TF 2.0 中使用 tf.keras,如何定义依赖于学习阶段的自定义层?
- python - Dask 数据框加入慢如熊猫
- html - 将输入文本着色为红色,“跳过”类中的输入除外
- runtime-error - 将 NuGet 包源迁移到解决方案中,但无法加载其构建的 DLL
- scala - 如何在 Couchbase 和 Scala 中过滤日期
- python - Python - Matplotlib 中的条形图 - 如何更改 X 轴