运算符~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。