C++/CPP 读取添加的十六进制地址



我对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

最新更新