C 按位还是不工作

C 按位还是不工作,c,C,请帮我输入这个代码。我不知道为什么输出不是8 #include <stdio.h> #include <stdlib.h> int main(){ char c; c = c & 0; printf("The value of c is %d", (int)c); int j = 255; c = (c | j); int i =0; while( (c & 1) == 1){ i++

请帮我输入这个代码。我不知道为什么输出不是8

#include <stdio.h>
#include <stdlib.h>
int main(){
    char c;
    c = c & 0;
    printf("The value of c is %d", (int)c);
    int j = 255;
    c = (c | j);
    int i =0;
    while( (c & 1) == 1){
        i++;
        c = c>>1;
    }
    printf("the value of i is %d",i);
    system("pause");
    return 0;
}
#包括
#包括
int main(){
字符c;
c=c&0;
printf(“c的值为%d”,(int)c);
int j=255;
c=(c | j);
int i=0;
而((c&1)==1){
i++;
c=c>>1;
}
printf(“i的值为%d”,i);
系统(“暂停”);
返回0;
}
对于所有给我-1的人,我试着打印这些值。但它进入了一个无限循环。

正如您从中了解到的,
char
在您的平台上签名。因此,在
while
循环开始时,
c
具有负值


右移负值是实现定义的。在您的平台上,我想象它正在执行一个。

尝试使用
无符号字符。标准的C
char
可以签名(通常在PC上)。

此代码在第一条语句中有未定义的行为
c
未初始化且具有不确定值,使用具有不确定值的对象,甚至按位与或乘以零,都会导致未定义的行为。

您是否尝试打印出变量的中间值?您不是在一小时前问了一个非常类似的问题吗?另外,自己尝试调试一下怎么样?这并不难,在while循环中添加printf并打印c的值。你会马上明白为什么你会在一个无限循环中。我想如果你问为什么右移不能按你所希望的那样工作,你就不会被否决。我不知道右移负值是实现定义的。如果对负值执行逻辑右移,则最终会得到一个正值,这没有任何意义。看起来C应该强制有符号整数右移位为算术移位。@Praetorian:它的实现是定义的,因为不同的硬件单元会做不同的事情(有些会做逻辑移位,有些会做算术移位)。强制执行特定行为将“惩罚”任何本机不支持强制行为的实现。没错,但强制执行也可能会说服为这些处理器设计硅的人实现算术移位:-),但我们必须接受我们所得到的。老实说,我认为这是一个C愚蠢的地方。如果您不关心负值的算术移位行为,那么应该使用无符号量。如果您真的在意,那么您想要的是“正确”的答案,而不是无用的实现定义的行为。除非出于算术移位的目的,有符号值上的位移位是没有意义的。实际上,标准没有定义
char
是有符号的还是无符号的。这似乎没有回答这个问题,但却引发了一个非常有趣的问题:无法从UD恢复。