操作符〜C++中(以及类似的C和Java其他类似C语言)执行按位非操作 - 中的所有操作数的1位被设置为0,并且所有的0比特在操作数是设置为1.换句话说,它会创建原始数字的补码。欲了解更多信息,请参阅here。
按位NOT运算符有一个有趣的属性,当用2的补码表示的数字应用 ,它改变了数字的 签收再减去一个(你可以在上面的例子中看到)。
如果你检查什么的〜 - 运算符不为y这样的:
#include <stdio.h>
int main()
{
unsigned int x = -1;
printf("%i\n",x); // treat data as if singed integer
printf("%u\n",x); // treat data is if unsigned integer
int y = ~0; //type promotion from int to unsigned int
printf("%i\n",y);
if (x == y)
printf("same");
else
printf("not same");
return 0;
}
你可以看到:
成功时刻:0记忆:16064信号:0
-1 same
T ry出here。
这是为什么?
为整数-1位表示为(见two's complement了解详细信息)
11111111 11111111 11111111 11111111
如果在无符号整数读这
11111111 11111111 11111111 11111111
是最大可能的无符号整型。由于环绕,无符号整数-1成为最大无符号整数。因此,无符号-1和int〜0是相同的。