изменение значения короткой переменной с помощью указателя на символ

Код:

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
какой именно вывод программы.

1

Решение

То, что здесь происходит, связано с тем, что у нас есть 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

3

Другие решения

Есть ли какая-то причина, по которой я получил другой результат при запуске программы выше?

Да. Независимый от языка ответ: потому что эта программа вызывает неопределенное поведение. Ответьте с учетом того, что могло бы произойти на самом деле: ваша система имеет иной порядок байтов, чем вы думаете, что он имеет.

3

По вопросам рекламы [email protected]