运行以下命令后,我会发现_pfloatPos和_charPos不同:
float* const _pData = new float[0x50000000];
float* const _floatPos = _pData + 0x400000B0;
char* const _charPos = ((char*)_pData) + 0x400000B0 * 4;
if ((char*)_floatPos != _charPos)
{
throw "Derp.";
}
也许我脑子迷了,错过了一些基本知识。这两个地址应该相同,对吗?
我看了看反汇编。 1000002C0h是4 * 0x400000B0。对于第二个,它似乎已经被截断了。
float* const _floatPos = _pData + 0x400000B0;
00007FF7CE48F6E2 mov rax,1000002C0h
00007FF7CE48F6EC mov rcx,qword ptr [_pData]
00007FF7CE48F6F0 add rcx,rax
00007FF7CE48F6F3 mov rax,rcx
00007FF7CE48F6F6 mov qword ptr [_floatPos],rax
char* const _charPos = ((char*)_pData) + 0x400000B0 * 4;
00007FF7CE48F6FA mov rax,qword ptr [_pData]
00007FF7CE48F6FE add rax,2C0h
00007FF7CE48F704 mov qword ptr [_charPos],rax
我正在使用Visual Studio 2017 15.9.2版,但是我不确定编译器的版本。
答案 0 :(得分:2)
您需要0x400000B0 * 4L
,否则乘法将溢出。
答案 1 :(得分:1)
我猜测David的答案适用于某些编译器,但是在Microsoft编译器中,我仍然收到警告和相同的结果。我在某些C ++文档中注意到“ long”仅提供“至少32bits的宽度”。因此,我将变量类型和表达式类型更改为long long;
long long _varLLxxLL = 0x400000B0 * 4LL;
std::cout << "_varLLxxLL has value " << _varLLxxLL
<< ", the expression had type " << typeid(0x400000B0 * 4LL).name() << "\n";
输出:
_varLLxxLL的值为4294968000,表达式的类型为__int64
比较:
long _varLxxxLx = 0x400000B0 * 4L;
std::cout << "_varLxxxLx has value " << _varLxxxLx
<< ", the expression had type " << typeid(0x400000B0 * 4L).name() << "\n";
输出:
_varLxxxLx的值为704,表达式的类型为long
我暂时不提问题。