C语言 什么是“~0”编译器如何计算它?[重复]

r55awzrz  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(279)

此问题在此处已有答案

What does tilde(~) operator do?(3个答案)
7小时前关闭。
浏览K&R C编程书的Excercise2.1。我试着查找它,但解释有点高。那么“~"是什么?为什么printf("%u", (unsigned char)~0);打印255printf("%u\n", ~0);打印4294967295
谢谢你:)

tp5buhyn

tp5buhyn1#

What does tilde(~) operator do?
这是一个按位的not,意味着所有的位都被翻转。
对于第一个示例,~运算符将整数0中的所有32位求反(存储为4 0x00000000字节),将其转换为全1(四个0x11111111字节)。然后将其转换为无符号字符,将其截断为一个0x11111111字节。在十进制中,0x11111111为255。对于第二个示例,由~0产生的四个0x11111111字节被解释为无符号int,其在十进制中等于4294967295。

2nc8po8w

2nc8po8w2#

首先你应该知道'~'字符是按位的NOT
让我们看看使用按位not时会发生什么

unsigned char var = 0;

printf("%u", ~var); // Output: 255

以二进制格式

# 8-Bit Variable

0b00000000 -> 0b11111111
OR
0b11111111 -> 0b00000000

或者另一个例子

0b11001100 -> 0b00110011

因此,我们了解到按位NOT反转变量中每一位,无论哪一位是0或1,都将反转
现在,如果我们对较大的变量使用按位NOT,会发生什么情况

unsigned short var = 0;

printf("%X", ~var); // Output: FFFF

二进制:

0b00000000_00000000 -> 0b11111111_11111111

因此,现在您可以确定按位NOT不关心变量值和变量大小,它只是反转变量中的所有位,即使您有一个64位的变量

相关问题