char类型按位操作失败到int

时间:2018-03-01 18:26:02

标签: c type-conversion bit-manipulation integer-promotion type-promotion

我尝试在C中按位操作。这是我的代码:

int main() {
    char c = 127;
    c <<= 1;
    if (c == 0xfe) {
        printf("yes");
    }
    else {
        printf("No");
    }
    return 0;
}

系统控制台打印编号 我期望收到的是是的。 位移后c中的值为ffffffffe。 似乎系统已经将8位改为32位。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:7)

您已正确找出低位字节的内容,即0xfe。但是,这里还有更多内容:当你写作时

if (c == 0xfe) {
    ...
}

您要将ccharint常量0xfe进行比较。在这种情况下,C规则要求推广 char cint进行比较。由于char已在您的平台上签名,0xfe会升级为0xfffffffe,这就是比较随后失败的原因。

如果您想在char类型中进行比较,请将0xfe投射到char,如下所示:

if (c == (char)0xfe) {
    ...
}

Demo 1.

另一方面,无符号字符可以帮助您int促销,因为它们非常适合int

unsigned char c = 127;
c<<=1;
if (c == 0xfe) { // No casting is necessary
    ...
}

Demo 2.

注意:由于c <<= 1溢出,char的行为是实现定义的。