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

时间:2013-07-25 22:36:43

标签: c binary char

这是我的问题代码:

#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

但是,我得到了1和坏2!

如果unsigned char b是255(11111111),则〜b应为00000000.为什么它不等于c?

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

2 个答案:

答案 0 :(得分:12)

你被整数促销活动所困扰。当你这样做时:

~b == c

bc都会升级为int。这意味着你真的在做:

~0x000000ff == 0

最终比较:

0xffffff00 == 0

哪个不匹配。它适用于您的第一种情况,因为您的char类型已签名,并在促销中获得了扩展标记:

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

答案 1 :(得分:2)

由于标准整数促销:在表达式~b中,操作数被提升为int,这可能类似于0x000000FF;结果是整数0xFFFFFF00

您必须将结果转换回unsigned char

if ((unsigned char)(~b) == c) /* ... */