运算符~c编程语言

~操作符如何在c中工作?

任何人都可以解释以下代码?

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

输出为-6

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

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

将打印

 -6 

这些位的工作原理如下。

5 = 0000 0101

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

-6 = 1111 1010。

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

 0b00000000000000000000000000001010 

〜5是5的按位NOT,它将是0xFFFFFFFA ,或者是二进制:

 0b11111111111111111111111111110101 

使用二进制补码 ,即-6

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

你会得到的。 最大unsigned int值是

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

〜运算符是按位NOT,它以二进制数反转位:

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

然后NOT 0101表示1010 = -6。 基本上〜用于表示按位NOT。

所以答案是-6。