无符号字符c = 255是“11111111”吗?

9
以下是我的问题代码:
#include "stdio.h"

int main()
{
        char a = -1;
        unsigned char b = 255;
        unsigned char c = 0;
        if((~a) ==  c)
                printf("OK 1");
        else
                printf("bad 1");
        printf("\n");
        if((~b) ==  c)
                printf("OK 2");
        else
                printf("bad 2");
        printf("\n");
}

我预计会打印出以下内容:
OK 1

OK 2

但是,我得到了OK 1和bad 2!

如果unsigned char b是255(11111111),那么~b应该是00000000。为什么它不等于c?

我在Linux SUSE上工作,使用gcc。

2个回答

12

你遇到了整数提升问题。当你执行以下操作时:

~b == c

bc都被升级为int。这意味着你实际上正在进行以下操作:

bc都会被转换成整数类型。

~0x000000ff == 0

这最终会进行比较:

0xffffff00 == 0

这两者不匹配。在第一个例子中,它可以工作是因为你的 char 类型是有符号的,并且在推广时得到了符号扩展:

~a == c
~(-1) == 0
~0xffffffff == 0
0 == 0

2
~0x000000ff 不等于 0xffffff00。它是 -0x100。 - R.. GitHub STOP HELPING ICE
R.. 是正确的。我只是在答案中展示位模式,这可能是一个不好的选择,因为这里涉及到与 C 标准相关的微妙之处。 - Carl Norum

2
由于标准整数提升,表达式~b中的操作数被提升为int,可能类似于0x000000FF;结果是整数0xFFFFFF00
您必须将结果转换回unsigned char
if ((unsigned char)(~b) == c) /* ... */

@CarlNorum:在我的符号表示法中,F是第256个符号 :-) - Kerrek SB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接