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

Lid*_*Guo 9 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");
}
Run Code Online (Sandbox Code Playgroud)

我希望这打印:

OK 1

OK 2
Run Code Online (Sandbox Code Playgroud)

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

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

我使用gcc在Linux SUSE上工作.

Car*_*rum 12

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

~b == c
Run Code Online (Sandbox Code Playgroud)

b并且c都得到晋升int.这意味着你真的在做:

~0x000000ff == 0
Run Code Online (Sandbox Code Playgroud)

最终比较:

0xffffff00 == 0
Run Code Online (Sandbox Code Playgroud)

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

~a == c
~(-1) == 0
~0xffffffff == 0
0 == 0
Run Code Online (Sandbox Code Playgroud)

  • *您的*代码证明了这一点.这就是C的工作方式. (5认同)
  • ~0x000000ff不是0xffffff00.它是-0x100. (2认同)