~
运算符在C语言中是按位取反的意思。
有人能解释一下下面这段代码吗?
main()
{
printf("%d",~5);
}
输出结果为-6
5
可能是一个32位带符号整数,其二进制表示为 0x00000005
,或者二进制表示为:
0b00000000000000000000000000001010
~5
是对5
进行按位取反运算得到的结果,即0xFFFFFFFA
,二进制表示为:
0b11111111111111111111111111110101
使用补码,即-6
。
main()
{
printf("%d",~5);
}
将会打印
-6
这些二进制位的工作方式如下:
5 = 0000 0101
当你对一个字节执行NOT操作时,你会翻转所有的1和0,从而得到新的数字
-6 = 1111 1010。
-6
的结果。例如,在使用补码整数的系统中,结果可能是 -5
。在使用符号-大小制的系统中,结果可能为 -65530
。 - Drew McGowen来自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
~ 运算符是按位取反运算符,它会翻转二进制数中的每一位:
因此,当我们将 5 转换为二进制时,5=0101
然后 NOT 0101 的结果是 1010=-6。基本上,~ 用于表示按位取反。
所以答案是 -6。