或C中的操作员不工作
我不明白为什么下面代码中的final或C中的操作员不工作,c,C,我不明白为什么下面代码中的finalprintf没有打印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。(以存储在中的值表示) 要获得预期效果,需要
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 c = 0;
int j = 255;
c = (c | j);
printf("The value of c is %d", (int)c);
它可能正在打印-1。那是因为
c = (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
是签名字符
在C中。如果要打印255
,请使用无符号字符
但是,我在带符号字符的上下文中解释了输出
使概念变得清晰。
如果写入j=127
,则它将打印127
,因为位表示为01111111。
但是如果你写j=128
然后它将打印-128
因为位表示01111111增加了1,变成10000000。
现在如果你写j=255
然后,位表示为11111111。所以它将打印-1
如果您写入j=256
然后它将打印0
因为当比特表示11111111增加1时,它变成100000000。但是只有1个字节被分配给characher变量,因此最左边的位不被存储,位表示变成00000000。
如果您写入j=257
然后也是溢出的情况,位表示变成00000001,将打印1
。打印什么?如果将“j”更改为char,会发生什么情况?您不需要强制转换(我讨厌强制转换)。编译器将在调用printf
之前自动强制转换,前提是它知道该参数是函数中变量参数的一部分——即:如果您在代码中的适当位置有#include
,则在许多实现中都会签署char
,但是C标准允许一个实现也具有未签名的char
。@dreamlax:如果上面的程序没有打印255
,那么它显然不能未签名。:)当然可以,但是你的回答让人觉得char
只能被签名。@dreamlax:澄清,然后。:)char的有符号性是当今一个非常现实的问题(与非8位字节不同):char
无符号的主要平台是ARM。如果你在做任何事情,那会很痛苦。