Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
或C中的操作员不工作_C - Fatal编程技术网

或C中的操作员不工作

或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。(以存储在中的值表示) 要获得预期效果,需要

我不明白为什么下面代码中的final
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。如果你在做任何事情,那会很痛苦。