C中的OR运算符不起作用

时间:2011-08-27 13:26:57

标签: 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);

4 个答案:

答案 0 :(得分:16)

在大多数实施中,char类型都已签名,因此其范围从-128127

这意味着11111111(用二进制写的255)等于-1。 (因为它表示为存储在two's complement

中的值

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

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

答案 1 :(得分:5)

可能打印-1。那是因为

c = (c | j);

将评估为

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

但是,由于c已签名,0xFF将为-1,而不是您预期的255。如果您将c更改为unsigned char,则会打印出255,如您所想。

答案 2 :(得分:2)

尝试将char c替换为unsigned char c。基本上,char类型支持-128到127之间的值。您的结果大于支持的范围并溢出。

答案 3 :(得分:0)

默认情况下char  是signed char  在C.如果您想要打印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.但是只为字符变量分配了1个字节,因此不存储最左边的位,并且位表示变为00000000。 如果你写j=257 那么它也是溢出的情况,位表示变为00000001并且将打印1