好的,这种不一致行为的实际原因是 char 和 unsigned 的潜在提升。我想更具体地解释一下。
首先,当与 int 和 unsigned int 变量进行比较时,它们的类型无关紧要,因为无论它们是什么类型,它们在内存中都具有相同的二进制表示,这就是 == 运算符所关心的。
而当 == 应用于 char 和 unsigned char 变量时,它们首先会扩展为对应的 32 位整数类型,而它们的扩展方式是不一致的关键。由于ca是一个字符,它将用符号位扩展(通过 MOVSX),而uca将仅用填充 0 扩展(通过 MOVZX)。因此,它们现在具有不一致的二进制表示。
汇编代码说明了这个事实。
int b1 = ia == uia;
000613E5 mov eax,dword ptr [ia]
000613E8 xor ecx,ecx
000613EA cmp eax,dword ptr [uia]
000613ED sete cl
000613F0 mov dword ptr [b1],ecx
int b2 = ca == uca;
000613F3 movsx eax,byte ptr [ca]
000613F7 movzx ecx,byte ptr [uca]
000613FB xor edx,edx
000613FD cmp eax,ecx
000613FF sete dl
00061402 mov dword ptr [b2],edx