Разное не то же самое. Попробуйте это:
#include <cstdio>
#include <iostream>
int main() {
int i = '6';
char *ii = reinterpret_cast<char*>(&i);
std::printf("%c\n", *ii);
std::printf("%d\n", *ii);
std::cout << *ii << '\n';
std::cout << (int)*ii << '\n';
}
Инициализация i
до '6'
- это просто пояснение.
При вызовах printf
значение char
, на которое указывает *ii
, повышается до int
в вызове функции. Типы, меньшие int
, повышаются, когда они являются аргументами переменной части функции, которая принимает список переменных параметров (например, printf
).
Первый оператор printf
печатает значение *ii
как символьное значение; вы получите «6». Вторая печатает его как целочисленное значение; вы получите любое значение, представляющее символ '6'
(в ASCII это 54, что, вероятно, вы и увидите).
Первая вставка в std::cout
вставляет значение char
; потоковые вставки перегружены для целочисленных типов, поэтому вы получаете вставщик, который принимает аргумент типа char
, и он отображает символ, который представляет значение, так же, как первый вызов printf
.
Вторая вставка в std::cout
вставляет целое значение *ii
, как и второй вызов printf
.