Вам необходимо некоторое понимание понятия «порядковый номер» здесь, чтобы значения могли быть представлены как «младший порядок» и «большой порядок».
Я собираюсь пропустить обсуждение того, насколько это законно, о вовлеченном неопределенном поведении.
(Вот, однако, соответствующая ссылка, предоставленная Lundin, кредиты:
Что такое строгое правило наложения имен? )
Но давайте посмотрим на пару байтов в памяти, из которых младший адрес содержит 50, а старший адрес содержит 49:
50 49
Вы вводите их именно таким образом, явно устанавливая младший и старший байты (через тип char
).
Затем вы читаете их, заставляя компилятор считать его short
, который является типом размером в два байта в вашей системе.
Компиляторы и аппаратные средства могут создаваться с разными «мнениями» о том, что является хорошим представлением двухбайтовых значений в двух последовательных байтах. Это называется "endianess".
Два компилятора, оба из которых полностью соответствуют стандартам, могут действовать следующим образом:
Возвращаемое short
1024 *
- взять значение с более низкого адреса, умножить его на 256, добавить значение с более высокого адреса
- взять значение с старшего адреса, умножить его на 256, добавить значение с младшего адреса
На самом деле они этого не делают, это гораздо более эффективный механизм, реализованный в аппаратном обеспечении, но дело в том, что даже реализация в аппаратной простоте делает то или иное.