【问题标题】:Bitwise operation in character字符中的按位运算
【发布时间】:2020-12-21 18:35:39
【问题描述】:

我很好奇 C 的按位运算符对字符的行为。

#include <stdio.h>

int main()
{
    int x = 108;
    x = x<<1;
    printf("%d\n", x);
    char y = 108;
    y = y<<1;
    printf("%d", y);
    //printf("%d", y<<1);

    return 0;
}

这里,如果我这样通过,y = y-40,当我直接打印时,

printf("%d", y

它的输出是 216

如何模拟它?

【问题讨论】:

    标签: c char bit


    【解决方案1】:

    请注意,在 char 类型上实际上没有 &lt;&lt; 操作 - &lt;&lt; 的操作数被提升为(至少)int 类型,结果同样是 int

    因此,当您执行y = y &lt;&lt; 1 时,您会将操作的int 结果截断为(有符号)char,从而留下最高有效位(符号位)设置,所以它被解释为一个负值。

    但是,当您将y &lt;&lt; 1 直接 传递给printf 时,生成的int 保持不变。

    【讨论】:

      【解决方案2】:

      y&lt;&lt;1 产生一个int。要获得 -40,您将其隐式转换为 char。在您的 printf 案例中,您需要明确地进行转换:(char)(y&lt;&lt;1)

      【讨论】:

      • 注意:它可能在不同的编译器上表现不同,或者使用不同的编译器标志; char 具有实现定义的签名,因此-40 暗示它是该实现上的signed(我认为int 截断回到char 在技术上是未定义的有符号溢出,但是不会对此发誓;大多数系统都是二进制补码并且行为与观察到的一样),但在另一个系统为unsigned 上也可以很容易地成为216。基本上,对于产生超出范围 [0, 128) 的结果的数学运算,切勿使用普通的 char
      • and I think the truncation from int back to char is technically undefined signed overflow 不用担心,实现已定义。
      • @ShadowRanger,都是真的,但这些都是适用于 OP 要求复制的代码的问题。我展示了如何复制代码、问题和所有内容。
      • @ikegami:我不是在批评,只是为了 OP 的利益而添加注释。
      • @KamilCuk:非常好,只是不可携带,没有鼻恶魔。 :-)
      猜你喜欢
      • 2014-04-08
      • 2013-05-23
      • 1970-01-01
      • 2019-04-21
      • 2011-07-29
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多