int
, вероятно, является 32-битным, что дает ему диапазон от -2 * 10 ^ 9 до 2 * 10 ^ 9.
В строке long int * pTheLong2 = &TheLong + 0x4;
вы выполняете арифметику указателя на long int*
, что означает, что адрес увеличится на размер 0x4
long int
с.Я предполагаю, что вы предполагаете, что long int
в два раза больше int
.Это абсолютно не гарантировано, но, вероятно, верно, если вы компилируете в 64-битном режиме.Таким образом, вы хотите добавить к вашему указателю половину размера long int
- ровно такого размера, как вы полагаете int
.int * pTheLong2 = (int*)(&TheLong) + 1;
достигает этого.
Вы на правильном пути, но, пожалуйста, имейте в виду, как уже отмечали другие, что вы сейчас изучаете неопределенное поведение.Это означает, что переносимость нарушена, и флаги оптимизации могут очень хорошо изменить поведение.
Кстати, более правильная вещь для вывода (при условии, что машина имеет младший порядок байтов) будет:
cout << "The long is " << TheLong << " which is "
<< TheInt1 << " + " << TheInt2 << " * 2^32" << endl;
Для полноты картины хорошо определенное преобразование 32-разрядного целого числа в два 16-разрядных:
#include <cstdint>
#include <iostream>
int main() {
uint32_t fullInt = 723330;
uint16_t lowBits = (fullInt >> 0) & 0x0000FFFF;
uint16_t highBits = (fullInt >> 16) & 0x0000FFFF;
std::cout << fullInt << " = "
<< lowBits << " + " << highBits << " * 2^16"
<< std::endl;
return 0;
}
Вывод: 723330 = 2434 + 11 * 2^16