【问题标题】:Operator ~ in c programming languagec语言中的操作符~
【发布时间】:2014-09-30 21:26:56
【问题描述】:

~ 运算符在 c 中是如何工作的?

谁能解释下面的代码?

main()
{
   printf("%d",~5);
}

输出是-6

【问题讨论】:

  • 相关:bitwise NOT 上的维基页面。
  • 这应该包含在您方便的 C 参考手册中。如果您没有方便的 C 参考手册,我推荐 Harbison & Steele 的 C: A Reference Manual

标签: c operators


【解决方案1】:

5(可能)是一个 32 位有符号整数,位表示为 0x00000005,或二进制:

0b00000000000000000000000000001010

~55 的按位非,即0xFFFFFFFA,或二进制:

0b11111111111111111111111111110101

使用two's complement,即-6

【讨论】:

  • 请注意,我说5 *可能是 32 位,因为根据 C 标准,int 不必是 32 位。它只需要等于或大于 short 的大小,它必须是 16 位或更多。
【解决方案2】:

c 中的 ~ 运算符是 NOT 位运算符。所以,在你的例子中

   main()
{
       printf("%d",~5);
}

将打印

-6

这些位的工作方式如下。

5 = 0000 0101

当你取一个字节的 NOT 时,你翻转所有的 1 和 0 来生成新的数字

-6 = 1111 1010。

【讨论】:

  • 请注意,它并不总是必须导致-6。 IE。在使用补码整数的系统上,结果为-5。在符号幅度系统上,结果可能类似于-65530
  • @DrewMcGowen 是对的。我只使用了 -6,因为这是 C 在我运行它时的默认值。
【解决方案3】:

来自 C 标准

4 ~ 运算符的结果是它的按位补码 (提升)操作数(即,结果中的每一位都被设置当且仅 如果未设置转换后的操作数中的相应位)。这 对操作数执行整数提升,结果有 提升的类型。如果提升的类型是无符号类型,则 表达式 ~E 等价于可表示的最大值 键入减 E。

所以如果你有 5 并且 sizeof(int) 等于 4 那么你将有

00000000 00000000 00000000 00000101 => 5
11111111 11111111 11111111 11111010 => ~5 == -6

如果你会使用unsigned int而不是int,例如

int main( void )
{
   printf("%u", ~5u );
}

那么正如引用中所说的那样

如果提升的类型是无符号类型,则表达式 ~E 是 等于该类型中可表示的最大值减去 E。

你会得到的。最大无符号整数值是

11111111 11111111 11111111 11111111 => UINT_MAX
-
00000000 00000000 00000000 00000101 => 5
=
11111111 11111111 11111111 11111010 => UINT_MAX - 5u

【讨论】:

    【解决方案4】:

    ~ 运算符是按位非,它将二进制数中的位反转:

    所以当我们将 5 转换为二进制 5=0101

    那么 NOT 0101 表示 1010=-6。基本上 ~ 用于表示按位非。

    所以答案是-6。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 2011-08-08
      • 2013-01-12
      • 1970-01-01
      • 2012-01-19
      相关资源
      最近更新 更多