我知道~
运算符不是,所以它反转二进制数中的位
unsigned int a = ~0, b = ~7;
printf("%dn",a);
printf("%dn",b);
printf("%un",a);
printf("%un",b);
我猜0将是1,7(0111)将是8(1000),但输出是
-1
-8
4294967295
4294967288
~0和~7是怎么变成-1和-8的?为什么%u要打印这么长的数字?
~
运算符只是对数字中的所有位进行反转。
在大多数现代编译器中,int
的大小为32位,而带符号的int
使用2的补码表示。这意味着,除其他事项外,高位保留给符号,如果该位为1,则该数字为负。
0
和7
是int
字面值。假设如上所述,我们得到以下结果:
-
0
是位00000000000000000000000000000000b
=0
当被解释为signed int
或unsigned int
-
~0
是位11111111111111111111111111111111b
=-1
当被解释为signed int
=4294967285
当被解释为unsigned int
-
7
是位00000000000000000000000000000111b
=7
当被解释为signed int
或unsigned int
-
~7
是位11111111111111111111111111111000b
=-8
当被解释为signed int
=4294967288
当被解释为unsigned int
在您的printf()
语句中,%d
将其输入解释为signed int
,%u
将其解释为unsigned int
。这就是为什么你会看到你得到的结果。
~
运算符对整型操作数的所有位进行反转。例如,int
是32位的,1是十六进制的0x00000001,它的补码是0xFFFFFFFE。当被解释为无符号时,它是4 294 967 294,作为2的补符号,-2。