Big-endian против little-endian, я думаю.
Код по своей сути зависит от платформы (официально, почти наверняка неопределенное поведение).Я не уверен, что вас учат этому, но, думаю, это проблема другого времени.
2 присваивается двум из четырех байтов arr[3]
.Если вместо этого назначить ((short *)arr)[7]
, вы можете увидеть ожидаемый результат.
На какой машине вы тестируете (какой тип процессора)?
Если подумать - хотя и частичнопроблема, возможно, имеет порядок с прямым порядком байтов по сравнению с прямым порядком байтов, другая проблема - short
против char
.Вот еще несколько кодов, которые показывают различные пути решения:
#include <stdio.h>
int main(void)
{
printf("sizeof(int) is %lu\n", sizeof(int));
printf("sizeof(short) is %lu\n", sizeof(short));
int arr[5];
arr[3] = 128;
((short*)arr)[6] = 2;
printf("arr[3] is equal to %8d (0x%08X)\n", arr[3], arr[3]);
arr[3] = 128;
((short*)arr)[7] = 2;
printf("arr[3] is equal to %8d (0x%08X)\n", arr[3], arr[3]);
for (int i = 12; i < 16; i++)
{
arr[3] = 128;
((char *)arr)[i] = 2;
printf("arr[3] is equal to %8d (0x%08X) i = %d\n", arr[3], arr[3], i);
}
return 0;
}
Вывод этого пересмотренного кода:
sizeof(int) is 4
sizeof(short) is 2
arr[3] is equal to 2 (0x00000002)
arr[3] is equal to 131200 (0x00020080)
arr[3] is equal to 2 (0x00000002) i = 12
arr[3] is equal to 640 (0x00000280) i = 13
arr[3] is equal to 131200 (0x00020080) i = 14
arr[3] is equal to 33554560 (0x02000080) i = 15
Тестирование на MacOS X 10.7.2 с GCC 4.2.1XCode 4.2 (LLVM).