C++/CPP 读取添加的十六进制地址
C++/CPP Reading an added hex address
我对CPP来说仍然相对较新,但我找不到任何有我问题的来源。 我的 IDE 是 MSVC 2017 预览版,我期望的结果是将两个十六进制地址相加,然后读取地址的值。 我不确定为什么,但它在添加十六进制数字方面效果不佳。 我给你我目前的例子:
int number;
ReadProcessMemory(pHandle, (void*)(0x37c90000 + 0xE29FE8), &number, sizeof(number), 0);
std::cout << number << " for " << std::hex << (0x37c90000 + 0xE29FE8) << std::endl;
ReadProcessMemory(pHandle, (void*)(0x38ab9fe8), &number, sizeof(number), 0);
std::cout << number << " for " << std::hex << (0x38ab9fe8) << std::endl;
std::cout << "a = " << (0x37c90000 + 0xE29FE8) << std::endl;
std::cout << "b = " << (0x38ab9fe8) << std::endl;
我对此代码的预测结果是,两个 ReadProcessMemory 应该获得相同的完全相同的值,但只有第二个 ReadProcessMemory(具有已添加的十六进制值(正确返回。
此外,Couting A 和 B 报告完全相同的地址。 如果是这样的话,为什么 ReadProcessMemory 会发脾气并在第一个 ReadProcessMemory 上报告负数?
这是我使用上述代码的结果:
-331287296 for 38ab9fe8
ec40f500 for 38ab9fe8
a = 38ab9fe8
b = 38ab9fe8
抱歉,但我真的想不通为什么它们有任何不同。
不,这似乎是对的。 0xec40f500
是十进制有符号值 -331287296
的无符号十六进制表示形式。请了解负数的二进制补码表示。
我相信,问题是std::hex
操纵器,它是粘性的。如果您在第二种情况下使用 std::dec
则两个数字将显示为十进制:
// Second output
std::cout << std::dec << number << " for " << std::hex << (0x38ab9fe8) << std::endl;
// ^^^^^^^^
// Display *all* following numbers as decimal
或者在第一个输出中使用std::hex
:
// First output
std::cout << std::hex << number << " for " << (0x37c90000 + 0xE29FE8) << std::endl;
// ^^^^^^^^
// Display *all* following numbers as hexadecimal
当然,如果您打算让number
无符号,则需要在定义变量时明确说明。也许您更容易看到0xec40f500
和无符号十进制值之间的联系3963680000
?
相关文章:
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- C++/CPP 读取添加的十六进制地址
- 从十六进制转换为LPCVoid,切断了一半地址
- 如何将十六进制添加到字符数组
- 如何将整数向量转换为 2 位十六进制并按顺序添加到 c 字符串?
- C++为什么字符串的地址尽管是十六进制格式,但不能存储在 long int 变量中?
- 如何添加两个或多个字符的十六进制值
- 将内存地址中的值打印为十六进制C++
- 添加带有十六进制字符串的整数
- 在文件中存储十六进制地址
- 我可以将指针地址(即十六进制整数)转换为C 中的十进制和八分位基础
- 为什么十六进制地址是14个字符
- c++seekg似乎返回了一个十六进制地址,而不是.txt文件中的实际字符
- 如何在c++中用大写字母打印地址(十六进制值)
- std::dec仍然将内存地址输出为十六进制
- 添加十六进制值以获得十六进制结果
- 指针地址给出的是1,而不是十六进制地址
- 添加十六进制地址到DLL地址的c++