Код:
int main(){
short a=1; // #1
char *p=(char*)&a;
*(p)=1; // #2
cout << a << endl; // Output: 1
*(p+1)=2; // #3
cout << a << endl; // Output: 513
}
Насколько я понимаю, результат должен быть таким, как показано на рисунке ниже, 257, а затем 258.
Есть ли какая-то причина, по которой я получил другой результат при запуске программы выше?
Обновить:
Я знаю, что это неопределенное поведение, но, тем не менее, означает ли это, что десятичное преобразование в двоичное выполняется не как обычно: справа налево, а вместо этого выполняется слева направо, например:
binary(a)=1000 0000 | 0000 0000
так *(p)=1;
сделаю binary(a)=1000 0000 | 0000 0000
который 1
в десятичном виде
а также *(p+1)=2;
сделаю binary(a)=1000 0000 | 0100 0000
который 513
какой именно вывод программы.
То, что здесь происходит, связано с тем, что у нас есть 2-байтовый short
в архитектуре процессора с прямым порядком байтов. Стандарт не требует, чтобы архитектура была LE, поэтому в любом случае эта программа может генерировать ряд разных результатов при запуске в разных системах.
short
здесь выкладывается в память младший значащий байт (LSB) первым:
Memory addresses ------>
LSB MSB
0000 0000 0000 0000
p
указывает на LSB и устанавливает в 1
:
0000 0001 0000 0000
Результат при интерпретации как short
LSB + 256 * MSB, то есть 1 + 0 * 256 = 1
p
затем указывает на MSB (который находится на следующий адрес памяти) и устанавливает в 2
:
0000 0001 0000 0010
Результат при интерпретации как short
: 1 + 2 * 256 = 513
Есть ли какая-то причина, по которой я получил другой результат при запуске программы выше?
Да. Независимый от языка ответ: потому что эта программа вызывает неопределенное поведение. Ответьте с учетом того, что могло бы произойти на самом деле: ваша система имеет иной порядок байтов, чем вы думаете, что он имеет.