ネイティブのunsigned long変数を、その内部に2つのunsigned short変数を含むバッファーとして使用しています。私のC++の知識から、有効な方法でなければなりません。私はこのメソッドを使用して、2つのunsigned charを1つのunsigned shortの中に何も問題なく格納します。残念なことに、それを別のアーキテクチャで使用すると、それは不思議に反応します。 2回目の割り当て後に値が更新されたようです。 (オーバーフロー)ケースはそれを実証するだけのものです。誰かがそれがなぜそのように反応するのかについていくつかの光を当てることができますか?型キャスト後の値の影響がありません
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の出力(OK):
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の "厳密なエイリアシング"(ソリューション:ユニオンを使用)を見てください。 – ninjalj