C中的OR运算符不起作用

Pro*_*mer 4 c

我不明白为什么printf下面的代码中的最后一个不打印255.

char c;
c = c & 0;
printf("The value of c is %d", (int)c);
int j = 255;
c = (c | j);
printf("The value of c is %d", (int)c);
Run Code Online (Sandbox Code Playgroud)

Seb*_*olm 16

在大多数实现的char类型是有符号的,所以它的范围是从-128127.

这意味着,11111111(255以二进制编写)等于-1.(因为它表示为存储在二进制补码中的值)

要获得您期望的结果,您需要声明c为a unsigned char,如下所示:

unsigned char c = 0;
int j = 255;
c = (c | j);
printf("The value of c is %d", (int)c);
Run Code Online (Sandbox Code Playgroud)

  • 在许多实现上签署了`char`,但C标准允许实现也使`char`无符号. (4认同)

And*_*gia 5

它可能打印-1.那是因为

c = (c | j);
Run Code Online (Sandbox Code Playgroud)

将评估为

c = (0 | 255) = (0 | 0xFF) = 0xFF
Run Code Online (Sandbox Code Playgroud)

但是,自c签名以来,0xFF将是-1而不是255,如你所料.如果您更改cunsigned char它会打印255,因为你的想象.