[英]Operator ~ in c programming language
~
操作符如何在c中工作?
任何人都可以解释以下代码?
main()
{
printf("%d",~5);
}
输出为-6
5
(可能)是一个32位有符号整数,位表示为0x00000005
,或者是二进制:
0b00000000000000000000000000001010
~5
是按位的NOT 5
,这将是0xFFFFFFFA
,或在二进制:
0b11111111111111111111111111110101
使用二进制补码 ,即-6
。
c中的〜运算符是NOT按位运算符。 所以,在你的例子中
main()
{
printf("%d",~5);
}
将打印
-6
这些位的工作原理如下。
5 = 0000 0101
当你取一个字节的NOT时,你翻转所有的1和0来制作新的数字
-6 = 1111 1010。
来自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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.