Случай 1:
Вы получаете 'a'*256²+'s'*256+'b' = 6386530
потому что 'a' = 97
, 's' = 115
, 'b' = 98
ср. Ascii стол
'asb' интерпретируется как целое число.
typeid('asb').name()[0] == 'i' && sizeof('asd') == 4;
Целое число составляет 32 бита, и вы можете хранить «asb» (24 бита) в виде целого числа.
Вот почему std :: cout интерпретирует его как целое число и отображает 6386530
Обратите внимание, что также:
typeid('xxxxabcd').name()[0] == 'i' && sizeof('xxxxabcd') == 4;
но xxxxabcd представлен 64-битными, поэтому 32-битные теряются.
std::cout << 'xxxxabcd';
std::cout << 'abcd';
напечатал бы то же самое.
Случай 2:
«asb» интерпретируется как целое число, и вы преобразуете его в символ (8 бит).
Как указал @BenjaminJones, сохраняются только последние 8 бит (98 == 'b').
И std :: cout интерпретирует его как символ, поэтому он отображает 'b'.
В любом случае, оба случая вызывают предупреждение компиляции, например:
warning: multi-character character constant [-Wmultichar]
warning: multi-character character constant [-Wmultichar] In function 'int main()'
warning: overflow in implicit constant conversion [-Woverflow]
Полагаю, поведение зависит от компилятора.