我不明白为什么下面代码中的最终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);
答案 0 :(得分:16)
在大多数实施中,char
类型都已签名,因此其范围从-128
到127
。
这意味着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
。