这是一个与 c99 标准相关的问题,涉及 unsigned char 的整数提升和按位否定。
在第 6.5.3.3 节中,它指出:
整数提升在操作数上执行,结果具有提升的类型。如果提升的类型是无符号类型,则表达式 ~E 等价于该类型中可表示的最大值减去 E。
当我这么说时,我是否理解正确,这意味着:
unsigned int ui = ~ (unsigned char) ~0; // ui is now 0xFF00.
我的困惑源于与一位同事的讨论,他在我们的编译器中看到了以下行为。
unsigned char uc = 0;
unsigned char ucInverted = ~0;
if( ~uc == ~0 ) // True, obviously
if( ~ucInverted == ~(~0) ) // False as it evaluates to: 0xFF00 == 0x0000
if( ~uc == ucInverted ) // False as it evaluates to: 0xFFFF == 0x00FF
if( uc == ~ucInverted ) // False as it evaluates to: 0x0000 == 0xFF00
使用 gcc 确认了此行为。
是否有可能获得正确的预期字符比较,其中每个案例都将评估为真?