【问题标题】:char type bitwise operation fails in to intchar 类型的按位运算失败为 int
【发布时间】:2018-08-09 21:54:56
【问题描述】:

我尝试在 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】:

您已经正确计算出低字节的内容,即0xfe。然而,这里实际发生的事情还有更多:当你写作时

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

您正在将cchar)与int 常量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.

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

【讨论】:

  • 注意c &lt;&lt;= 1; 中的行为是实现定义的,由于溢出。
  • 感谢您的回答,但我真的想弄清楚位移动后 c 的价值是什么。当我在 c 中 printf 值时,它显示 0xffff fffe。
  • @EricPostpischil 没错,符号扩展值的行为也是如此。感谢您的评论!
  • c = 0xfffffffe 位移动后。它被提升为 64 位。有没有办法让位移动不会促进类型?
  • @Akrios c 的值是0xfe,其余的fs 在对printf 的调用中通过整数提升添加。换句话说,当您打印printf("%x", c) 时,您打印的是(int)c,而不仅仅是c,因为C 标准将转换作为对可变参数函数的调用的一部分。
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
相关资源
最近更新 更多