繁体   English   中英

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) 但 output 是

-1
-8
4294967295
4294967288

~0 和 ~7 是如何变成 -1 和 -8 的? 还有为什么 %u 打印那么长的数字?

~运算符只是将数字中的所有位反转。

在大多数现代编译器中, int的大小为 32 位,而有符号int使用2 的补码表示。 这意味着,除其他外,高位是为符号保留的,如果该位为 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 这就是为什么你看到你得到的结果。

~运算符反转 integer 操作数的所有位。 因此,例如int是 32 位,1 是十六进制的 0x00000001,它的补码是 0xFFFFFFFE。 当解释为无符号时,即 4 294 967 294,而作为带符号的二进制补码,则为 -2。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM