我不明白为什么下面的代码中最后一个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);
我不明白为什么下面的代码中最后一个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);
大多数情况下,char
类型是有符号的,因此它的范围从 -128
到 127
。
这意味着,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);
char
类型是有符号的,但是 C 标准也允许实现将 char
定义为无符号类型。 - dreamlax255
,那么它显然不可能是无符号的 :) - Sebastian Paaske Tørholmchar
еҸӘиғҪжҳҜжңүз¬ҰеҸ·зҡ„гҖӮ - dreamlaxchar
无符号的主要平台是 ARM。如果你正在做嵌入式开发,这将是一件痛苦的事情。 - David Givenc = (c | j);
将被评估为
c = (0 | 255) = (0 | 0xFF) = 0xFF
但是,由于c
是有符号的,所以0xFF
将会是-1而不是你期望的255。如果你将c
改成unsigned char
,它将打印出255,就像你想象的那样。
尝试将char c
替换为unsigned char c
。基本上,char类型支持从-128到127的值。您的结果超出了支持的范围并发生了溢出。
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
。
printf
之前自动进行转换,前提是它知道该参数是函数中的可变参数的一部分 - 即:前提是你在代码的适当位置包含了#include <stdio.h>
。 - pmg