char类型按位操作失败到int

问题描述 投票:4回答:1

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

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

系统控制台打印否。我希望收到的是是。位移后c中的值为ffffffffe。似乎系统已经将8位改为32位。谁能帮我。

c type-conversion bit-manipulation integer-promotion type-promotion
1个回答
7
投票

你已经正确地找出了低位字节的内容,即0xfe。然而,在这里发生的事情还有更多:当你写作时

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

你正在将ccharint常数0xfe进行比较。在这种情况下,C规则要求将char c推广到int进行比较。由于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的行为是实现定义的。

© www.soinside.com 2019 - 2024. All rights reserved.