我正在迁移一些旧的C++代码,最初是使用CodeGear C++Builder® 2009 Version 12.0.3170.16989编译的。
下面的代码是一个较大代码片段的最小版本,使用任何现代编译器都会输出-34
。然而,在原始平台上它输出84
:
char Key[4];
Key[0] = 0x1F;
Key[1] = 0x01;
Key[2] = 0x8B;
Key[3] = 0x55;
for(int i = 0; i < 2; i++) {
Key[i] = Key[2*i] ^ Key[2*i + 1];
}
std::cout << (int) Key[1] << std::endl;
以下代码在旧版和新版编译器中都输出
-34
:
for(int i = 0; i < 2; i++) {
char a = Key[2*i];
char b = Key[2*i + 1];
char c = a ^ b;
Key[i] = c;
}
此外,手动展开循环似乎在两个编译器中都有效:
Key[0] = Key[0] ^ Key[1];
Key[1] = Key[2] ^ Key[3];
我需要与旧代码的行为匹配,所以了解原始编译器为什么会产生这些结果很重要。请问有谁能帮我理解吗?
Key[1] = Key[1] ^ Key[3]
,因为这会得到84的结果。 - lxop