c 中的 printf 代字号运算符
printf tilde operator in c
我知道 ~
运算符不是,所以它反转二进制数中的位
unsigned int a = ~0, b = ~7;
printf("%d\n",a);
printf("%d\n",b);
printf("%u\n",a);
printf("%u\n",b);
我猜 0 会是 1 而 7 (0111) 会是 8 (1000) 但输出是
-1
-8
4294967295
4294967288
~0 和 ~7 是如何变成 -1 和 -8 的?还有为什么 %u 打印那么长的数字?
~
运算符反转整数操作数的 所有 位。因此,例如 int
是 32 位,1 是十六进制的 0x00000001,它的补码是 0xFFFFFFFE。当解释为无符号时,即 4 294 967 294,当解释为有符号二进制补码时,-2.
~
运算符简单地反转数字中的所有位。
在大多数现代编译器上,int
的大小为 32 位,signed int
使用 2's complement 表示。这意味着,除其他外,高位保留给 符号 ,如果该位为 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
。这就是您看到结果的原因。
我知道 ~
运算符不是,所以它反转二进制数中的位
unsigned int a = ~0, b = ~7;
printf("%d\n",a);
printf("%d\n",b);
printf("%u\n",a);
printf("%u\n",b);
我猜 0 会是 1 而 7 (0111) 会是 8 (1000) 但输出是
-1
-8
4294967295
4294967288
~0 和 ~7 是如何变成 -1 和 -8 的?还有为什么 %u 打印那么长的数字?
~
运算符反转整数操作数的 所有 位。因此,例如 int
是 32 位,1 是十六进制的 0x00000001,它的补码是 0xFFFFFFFE。当解释为无符号时,即 4 294 967 294,当解释为有符号二进制补码时,-2.
~
运算符简单地反转数字中的所有位。
在大多数现代编译器上,int
的大小为 32 位,signed int
使用 2's complement 表示。这意味着,除其他外,高位保留给 符号 ,如果该位为 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
。这就是您看到结果的原因。