这是一个与C99标准相关的问题,涉及到无符号字符的整数提升和按位取反。
在第6.5.3.3节中,它指出:
整数提升是在操作数上执行的,并且结果具有提升后的类型。如果提升后的类型是无符号类型,则表达式~E等价于该类型中可表示的最大值减去E。
当我说这意味着什么时,我的理解是:
这种行为已经被gcc确认。
是否可能获得适当的预期字符比较,使得这些情况中的每一个都将计算为true?
在第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确认。
是否可能获得适当的预期字符比较,使得这些情况中的每一个都将计算为true?
~0
是陷阱表示,则行为未定义。 - Grijesh Chauhan~0
不是无符号的... - Oliver Charlesworth