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

C++/CPP读取添加的十六进制地址,c++,winapi,readprocessmemory,C++,Winapi,Readprocessmemory,我对CPP还比较陌生,但我找不到任何有我问题的来源。我的IDE是MSVC 2017预览版,我想要的结果是将两个十六进制地址相加,然后读取地址的值。我不知道为什么,但它不能很好地添加十六进制数。我将向您介绍我当前的示例: int number; ReadProcessMemory(pHandle, (void*)(0x37c90000 + 0xE29FE8), &number, sizeof(number), 0); std::cout << number << "

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

很抱歉,但我真的不明白为什么它们在任何方面都不同。

不,这似乎是对的。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

当然,如果您想让number不带符号,那么在定义变量时需要显式地这样说。也许您更容易看到0xec40f500和无符号十进制值3963680000之间的连接?

如果您将十六进制转换为有符号整数,它们是相同的。但是,我无法找出不一致的原因,这就像在电话簿中查找Alice和Bob,并将他们的电话号码相加一样。你可以这样做,但这似乎不值得努力。最终目标是添加一个带偏移量的基址来获得多级指针。除了添加地址和读取数据之外,还有更好的解决方案吗?太好了,我简直不敢相信这会让我不知所措。谢谢你的澄清。老实说,我真不敢相信这会从我头上飞过,尽管我知道这很简单。
// Second output
std::cout << std::dec << number << " for " << std::hex << (0x38ab9fe8) << std::endl;
//           ^^^^^^^^
// Display *all* following numbers as decimal
// First output
std::cout << std::hex << number << " for " << (0x37c90000 + 0xE29FE8) << std::endl;
//           ^^^^^^^^
// Display *all* following numbers as hexadecimal