【问题标题】:C bitwise negation creates negative output: [duplicate]C按位求反产生负输出:[重复]
【发布时间】:2012-09-22 14:56:13
【问题描述】:

我非常努力地翻转 C int 变量中的位。我是这样做的:

input = 15;

input = ~input;

printf("%d", input);

但它总是显示为-16。应该是0!如果15 写成1111,为什么会返回10000?!这太让人抓狂了!有人可以帮帮我吗!?

【问题讨论】:

  • 您忘记了%d 格式的引号;我已经添加了它们。
  • 通常最好复制并粘贴您的实际工作代码;这巧妙地避免了拼写错误和类似的错误。

标签: c bit-manipulation


【解决方案1】:

由于您系统上的int 很可能是一个 32 位数字,因此所有位都被翻转,包括原始数字中无意义的零的位:

00000000000000000000000000001111

变成

11111111111111111111111111110000

这是一个负数:15 的最高位为零,所以翻转时变为1

如果您只想保留原始数字的位,则需要在数字的重要位置用所有位进行掩码,如下所示:

printf("%d\n", input & 0xF);

ANDing 和 0xF“切断”除最后四位之外的所有位。

【讨论】:

    【解决方案2】:

    这是因为input 由多于四位组成。如果我们假设input是一个signed char,有8位(或一个字节),那么:

    input == 15 == 0x0F == 0b00001111
    

    如您所见,input 的高 4 位均为 0。经过位非运算 (~) 后,我们有:

    ~input == -16 == 0xF0 == 0b11110000
    

    以前为零的四个位现在是一,现在是零。有符号变量中的最高有效位确定其符号(0 为正,1 为负)。因此,通过翻转位,符号已被反转。负数可以读作:

    1      1     1     1     0     0     0   0
    -128 + 64  + 32  + 16  + 0   + 0   + 0 + 0
    

    解析为打印的 -16。

    如果您的作业是使用按位 NOT 将变量归零,请尝试将 input 声明为 unsigned char 以避免担心符号位。然后,将input 设置为255,这是一个8 位变量可以容纳的最大值(0xFF0b11111111)。

    【讨论】:

      【解决方案3】:

      15 的类型为 int。根据int 的大小,15 的表示以1111 结尾,但它开始以一堆0s。

      ~ 运算符翻转所有位; 1s(其中 4 个)变为 0s,0s(其中 N-4 个)变为 1s。

      【讨论】:

        猜你喜欢
        • 2021-10-06
        • 1970-01-01
        • 2021-08-02
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 2011-07-20
        相关资源
        最近更新 更多