Я использую собственную беззнаковую длинную переменную в качестве буфера, который содержит внутри две беззнаковые короткие переменные. Насколько я знаю С++, это должен быть правильный метод. Я использовал этот метод для хранения 2 беззнаковых символов внутри одного беззнакового короткого много раз без каких-либо проблем. К сожалению, при использовании его на другой архитектуре он ведет себя странно. Кажется, он обновляет значение после второго присвоения. Случай (Overflow) существует просто для того, чтобы продемонстрировать это. Может ли кто-нибудь пролить свет на то, почему он так реагирует?
unsigned long dwTest = 0xFFEEDDCC;
printf("sizeof(unsigned short) = %d\n", sizeof(unsigned short));
printf("dwTest = %08X\n", dwTest);
//Address + values
printf("Addresses + Values: %08X <- %08X, %08X <- %08X\n", (DWORD)(&((unsigned short*)&dwTest)[0]), (((unsigned short*)&dwTest)[0]), (DWORD)(&((unsigned short*)&dwTest)[1]), (((unsigned short*)&dwTest)[1]) );
((unsigned short*)&dwTest)[0] = (WORD)0xAAAA;
printf("dwTest = %08X\n", dwTest);
((unsigned short*)&dwTest)[1] = (WORD)0xBBBB;
printf("dwTest = %08X\n", dwTest);
//(Overflow)
((unsigned short*)&dwTest)[2] = (WORD)0x9999;
printf("dwTest = %08X\n", dwTest);
Вывод Visual С++ 2010 (ОК):
sizeof(unsigned short) = 2
dwTest = FFEEDDCC
Addresses + Values: 0031F728 <- 0000DDCC, 0031F72A <- 0000FFEE
dwTest = FFEEAAAA
dwTest = BBBBAAAA
dwTest = BBBBAAAA
Выход ARM9 GCC Crosstool (не работает):
sizeof(unsigned short) = 2
dwTest = FFEEDDCC
Addresses + Values: 7FAFECD8 <- 0000DDCC, 7FAFECDA <- 0000FFEE
dwTest = FFEEDDCC
dwTest = FFEEAAAA
dwTest = BBBBAAAA
-Wall
) и посмотрите на предупреждения. Затем посмотрите здесь на SO для строгого псевдонима (решение: используйте союз). - person ninjalj   schedule 16.11.2011