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,则数字为负数。

07int 文字。假设以上,我们得到这些结果:

  • 0 是位 00000000000000000000000000000000b
    = 0 解释为 signed intunsigned int

  • ~0 是位 11111111111111111111111111111111b
    = -1 解释为 signed int
    = 4294967285 解释为 unsigned int

  • 7 是位 00000000000000000000000000000111b
    = 7 解释为 signed intunsigned int

  • ~7 是位 11111111111111111111111111111000b
    = -8 解释为 signed int
    = 4294967288 解释为 unsigned int

在您的 printf() 语句中,%d 将其输入解释为 signed int,而 %u 将其解释为 unsigned int。这就是您看到结果的原因。