【问题标题】:How (~(0)) will be interpreted in c?(~(0)) 将如何在 c 中解释?
【发布时间】:2014-06-24 05:42:06
【问题描述】:

最近在 CCS 标准库中我看到了类似的东西

函数采用 unsigned int 参数。

delay(unsigned int)

这是这样使用的

delay(~(0));

现在如何解释 (~(0)) ?

如果我这样使用

printf("%d",(~(0)));

它是如何处理有符号整数的?无符号整数?长整数?还是无符号字符?

它如何依赖于系统? c 规范对此有何规定?

【问题讨论】:

  • printf 中,这完全取决于格式说明符。但是你必须小心非法转换是未定义的(例如:整数到浮点数,反之亦然)
  • printf() 中,参数是什么无关紧要,甚至格式说明符是什么都无关紧要,因为可变参数函数的参数受整数提升的影响。 printf("%d",(char)(~(0)))printf("%d", (short)(~(0)))printf("%d", (int)(~(0))) 都将打印相同的类型,一个整数。

标签: c


【解决方案1】:

回想一下,~ 是按位非运算符,0 是一个整数,sizeof(int) 大小为字节。

由于0 的所有位都设置为零,(~0) 的所有位都设置为 1。

如果(像大多数系统一样),你的sizeof(int)==4,然后(~0) == 0xFFFFFFFF

基本上,这是delaying 可能的最大值(假设delay(unsigned int)


#include <stdio.h>
#include <limits.h>

int main(void)
{
    printf("sizeof(0)=%d sizeof(~0)=%d\n", sizeof(0), sizeof(~0));
    printf("0x%X\n", (~0));
    printf("%d\n", (~0)==UINT_MAX);
    return 0;
}

输出:

$ ./a.out
sizeof(0)=4 sizeof(~0)=4
0xFFFFFFFF
1

【讨论】:

  • 你说“0是一个整数”你怎么能这么说?有什么标准吗?
  • 当然,有人可以挖掘规范...但我的意思是,来吧。 它是一个整数 - 它还能是什么?
  • 我怀疑整数文字应该是可以表示该值的最小类型。想想如果我使用的文字值比 int 最大值多,那么它会被视为 int 吗?还是别的什么?
  • 现在同意..谢谢!!我们是这样的用户,我们理解“规范”而不是“来吧……等等……”:)
【解决方案2】:

默认情况下,所有整数常量都被视为signed int。但是,当您使用printf 打印它时,参数将根据格式说明符进行类型转换/提升。

delay(~(0)); 中,我假设delay() 将始终期望unsigned int 参数,因此~0 == 0xffffffff(因为int 是4 个字节,因此0xffffffff)将被提升为unsigned int

【讨论】:

    【解决方案3】:

    ~0 是一个全为 1 位的 int(因为一元 ~ 是按位非运算符)。在大多数机器上,它是 -1two's complement 机器上,例如 x86

    所以printf("%d\n", ~0); 输出 -1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2018-06-17
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 2017-03-10
      相关资源
      最近更新 更多