C语言中的OR运算符无法工作

4

我不明白为什么下面的代码中最后一个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);

它打印了什么?如果将“j”更改为char会发生什么? - Joe
你不需要强制转换(我讨厌强制转换)。编译器会在调用 printf 之前自动进行转换,前提是它知道该参数是函数中的可变参数的一部分 - 即:前提是你在代码的适当位置包含了 #include <stdio.h> - pmg
4个回答

16

大多数情况下,char 类型是有符号的,因此它的范围从 -128127

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

要获得您期望的结果,您需要将 c 声明为 unsigned char,像这样:

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

4
在许多实现中,char 类型是有符号的,但是 C 标准也允许实现将 char 定义为无符号类型。 - dreamlax
@dreamlax:如果上面的程序没有打印 255,那么它显然不可能是无符号的 :) - Sebastian Paaske Tørholm
1
еҪ“然пјҢдҪҶжҳҜдҪ зҡ„еӣһзӯ”и®©дәәи§үеҫ—charеҸӘиғҪжҳҜжңүз¬ҰеҸ·зҡ„гҖӮ - dreamlax
@dreamlax:好的,明白了。 :) - Sebastian Paaske Tørholm
char 的符号性在当今是一个非常真实的问题(不像非 8 位字节那样):char 无符号的主要平台是 ARM。如果你正在做嵌入式开发,这将是一件痛苦的事情。 - David Given

5
它可能会打印-1。这是因为
c = (c | j);

将被评估为

c = (0 | 255) = (0 | 0xFF) = 0xFF

但是,由于c是有符号的,所以0xFF将会是-1而不是你期望的255。如果你将c改成unsigned char,它将打印出255,就像你想象的那样。


2

尝试将char c替换为unsigned char c。基本上,char类型支持从-128到127的值。您的结果超出了支持的范围并发生了溢出。


0
默认情况下,在C语言中,char是有符号的。如果你想打印出255,那么请使用unsigned char。但是我会在signed char的上下文中解释输出,以便概念变得清晰明了。
如果你写j=127,那么它将打印出127,因为位表示形式是01111111。但是,如果你写j=128,那么它将打印出-128,因为位表示形式01111111增加了1变成10000000。
现在,如果你写j=255,那么位表示形式是11111111。所以它将打印出-1。如果你写j=256,那么它将打印出0,因为当位表示形式11111111增加1时,它变成了100000000。但是,只有一个字节被分配给字符变量,所以最左边的位没有被存储,位表示形式变成了00000000。
此外,如果你写j=257,那么也是溢出的情况,位表示形式变成了00000001,将打印出1

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