3

这是一个与 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 确认了此行为。

是否有可能获得正确的预期字符比较,其中每个案例都将评估为真?

4

1 回答 1

2

~uc是类型int(值0xFFFF)。 ucInvertedunsigned char(value 0xFF) 类型,然后提升为int(value 0x00FF)。因此它们不相等。

我想你可以做到if ((unsigned char)~uc == ucInverted)。两个操作数仍将进行提升,但在提升之前它们将具有相同的值。

于 2013-09-23T10:49:20.143 回答