Вы неправильно понимаете использование reinterpret_cast. Пожалуйста, ознакомьтесь с этой страницей документации по reinterpret_cast.
Ваша функция делает следующее: Строка char* p = "12345";
создает переменную типа указатель на символ с именем p
, которая указывает на область памяти, содержащую буфер констант, инициализированный 6 байтами \0x31\0x32\0x33\0x34\0x35\0x00
. Когда вы передаете эту переменную p, например, в printf, она интерпретирует память, на которую указывает p
, как строку с завершающим нулем и печатает «12345».
Строка long long x = *reinterpret_cast<long long*>(p);
создает временный указатель на long-long, инициализированный значением p, что означает, что он указывает на ту же область памяти, что и p (на самом деле это поведение undefined, как в случае 6 в приведенной выше ссылке), затем разыменовывает его и присваивает значение x
. Поскольку long long
обычно имеет длину 8 байт, а p указывает только на 6 допустимых байтов, это разыменование снова является поведением undefined, но вы получаете 228509037105 (двоичный 0x3534333231), что означает, что ваша машина имеет обратный порядок байтов, а дополнительные 2 байта также равны 0. .
Если вы хотите получить x == 12345
, правильный способ сделать это long long x = std::stoll(p)
.
Вы также неправильно понимаете тот факт, что «Однако из того, что мне позже сказали, можно прочитать 8 байтов из массива символов, используя reinterpret_cast». Что вы можете сделать, так это преобразовать значение char*
в значение long long
, предполагая, что sizeof void*
не больше, чем sizeof(long long)
на вашем компьютере (см. случай 2 в ссылке выше). Если sizeof void*
равно 8, то вы «читаете 8 байтов из« массива символов »(фактически из указателя на символ): long long x = reinterpret_cast<long long>(p)
. Это дает вам адрес, который изначально содержал p, сохраненный как значение long long
в переменной x Все, что вы делаете с этим значением, кроме приведения его обратно к char*
, является неопределенным поведением.Вы можете сделать, например, printf(reinterpret_cast<char*>(x))
, что напечатает исходный буфер символов "12345".
person
axnsan
schedule
22.07.2014
reinterpret_cast
работает совсем не так. См. справку. - person chris   schedule 22.07.2014