繁体   English   中英

运算符~c编程语言

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM