Указатель арифметической путаницы или странного поведения - PullRequest
0 голосов
/ 16 января 2019

Когда выполняется следующее, я получаю разные _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, но я не уверен насчет версии компилятора.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Я предполагаю, что ответ Дэвида работает для некоторых компиляторов, но в компиляторе Microsoft я все еще получал предупреждения и тот же результат.В какой-то документации на C ++ я заметил, что «long» обеспечивает только «ширину не менее 32 бит».Поэтому я изменил тип переменной и тип выражения на 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

Я оставлювопрос открыт пока.

0 голосов
/ 16 января 2019

Вам нужно 0x400000B0 * 4L или умножение переполнится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...