Вы транслируете char
с. Они автоматически распознаются ASCII для вас IOStreams *, поэтому вы видите (или, скорее, не видите) непечатаемые символы (фактически все 0x01 байт).
Вы можете привести к int
, чтобы увидеть числовое значение, и, возможно, добавить std::hex
для обычного вида.
Пример:
#include <iostream>
#include <iomanip>
int main()
{
int a = 0;
// Alias the first four bytes of `a` using `char*`
char* x1 = (char*)&a;
char* x2 = x1 + 1;
char* x3 = x1 + 2;
char* x4 = x1 + 3;
*x1 = 1;
*x2 = 1;
*x3 = 1;
*x4 = 1;
std::cout << std::hex << std::setfill('0');
std::cout << '@' << std::setw(2) << "0x" << (int)*x1
<< ' ' << std::setw(2) << "0x" << (int)*x2
<< ' ' << std::setw(2) << "0x" << (int)*x3
<< ' ' << std::setw(2) << "0x" << (int)*x4
<< '@' << '\n';
std::cout << "0x" << a << '\n';
}
// Output:
// @0x01 0x01 0x01 0x01@
// 0x1010101
Те, кто говорит, что ваша программа имеет неопределенное значение, неверны (при условии, что в вашем int
есть как минимум четыре байта); алиасинг объектов через char*
специально разрешен.
Вывод 16843009
правильный; это равно 0x01010101
, которое вы снова увидите, если переведите свой поток в шестнадцатеричный режим.
N.B. Некоторые люди рекомендуют reinterpret_cast<char*>(&a)
и static_cast<int>(*x1)
вместо бросков в стиле C, хотя лично я считаю их уродливыми и ненужными в данном конкретном случае. Для вывода вы можете, по крайней мере, написать +*x1
, чтобы получить «бесплатное» повышение до int
(через унарный оператор +
), но это не очень самодокументируется.
* Технически это что-то вроде противоположности; IOStreams обычно автоматически преобразует ваши числа, логические значения и все в правильные символы ASCII, чтобы они отображались правильно на экране. Для char
этот шаг пропускается, при условии, что вы уже предоставляете нужное значение ASCII.