【发布时间】:2011-12-29 22:34:39
【问题描述】:
我使用本地无符号长变量作为缓冲区,用于在其中包含两个无符号短变量。根据我对 C++ 的了解,它应该是一种有效的方法。我多次使用这种方法将 2 个 unsigned char 存储在一个 unsigned short 中,没有任何问题。不幸的是,当在不同的架构上使用它时,它的反应很奇怪。似乎在第二次分配后更新了值。 (溢出)案例只是为了证明它。谁能解释一下它为什么会这样反应?
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 C++ 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 上查看“严格别名”(解决方案:使用联合)。