C编程语言中的~运算符

3

~运算符在C语言中是按位取反的意思。

有人能解释一下下面这段代码吗?

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

输出结果为-6


相关:按位取反的维基页面。 - wkl
这个应该在你方便的C参考手册中有所涵盖。如果你没有方便的C参考手册,我推荐Harbison & Steele的C: A Reference Manual - John Bode
4个回答

7

5 可能是一个32位带符号整数,其二进制表示为 0x00000005,或者二进制表示为:

0b00000000000000000000000000001010

~5是对5进行按位取反运算得到的结果,即0xFFFFFFFA,二进制表示为:

0b11111111111111111111111111110101

使用补码,即-6


2
请注意,我说“5”可能是32位,因为根据C标准,int不必是32位。它只需要等于或大于short的大小,而short必须为16位或更多。 - Jashaszun

2
在C语言中,~运算符是按位取反运算符。因此,在您的示例中,
   main()
{
       printf("%d",~5);
}

将会打印

-6

这些二进制位的工作方式如下:

5 = 0000 0101

当你对一个字节执行NOT操作时,你会翻转所有的1和0,从而得到新的数字

-6 = 1111 1010。


3
请注意,并不总是会得到 -6 的结果。例如,在使用补码整数的系统中,结果可能是 -5。在使用符号-大小制的系统中,结果可能为 -65530 - Drew McGowen
@DrewMcGowen 是正确的。我只是用了-6,因为这是我运行时C默认的。 - BCza

2

来自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

0

~ 运算符是按位取反运算符,它会翻转二进制数中的每一位:

因此,当我们将 5 转换为二进制时,5=0101

然后 NOT 0101 的结果是 1010=-6。基本上,~ 用于表示按位取反。

所以答案是 -6。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接