【问题标题】:C and number suffixesC 和数字后缀
【发布时间】:2014-08-13 16:23:18
【问题描述】:

我有一个关于在 C 中为数字使用后缀的问题。

例子:

long long c;

变量 c 是 long long 类型。为了启动它的价值,我(通常)这样做

c = 12;

这样做后,编译器会将 c 识别为 long long 类型。

如果我这样做了

printf("%d",sizeof(c));

结果是 8 - 当然是 64 位。所以编译器会记住 c 是 long long 类型。

但是我已经看到了一些示例,我需要通过这样做来强制类型变长

c = 12LL

这是为什么呢?

【问题讨论】:

  • 注意:printf("%d",sizeof(c)); 不可移植。最好使用printf("%zu", sizeof(c));
  • 顺便说一句,sizeof 是一个运算符(不是函数),但我很少看到它在没有括号的情况下使用。

标签: c


【解决方案1】:

您将变量c 声明为long long,所以它是long long int。变量的类型不依赖于它的值;相反,c 的可能值范围取决于c 的类型。

另一方面:对于整数常量/文字,类型由其值和后缀(如果有)确定。 12 没有前缀,所以它是一个十进制常量。它没有后缀,这意味着它的类型为int,因为12 保证在它的长范围内。 12LL 没有前缀,所以它也是一个十进制常量。它的后缀为LL,表示它的类型为long long int。将 12 分配给变量 c 是安全的,因为 int 可以安全地转换为 long long int

希望对您有所帮助。

【讨论】:

  • 啊。我想说“啊,当然!”,但我会满足于“啊”:-)
  • "12 没有前缀,所以它是一个十进制常量。"不完整。 0 是一个无符号八进制常数。 012345 也是一个无符号八进制常数。在 32 位机器上,4000000000 是一个无符号十进制。这个答案关于后缀的讨论很好,但是带/不带前缀的常量需要钙化。
【解决方案2】:
long long c;
c = 12;

clong long 类型,但 12int 类型。当12 分配给long long 对象c 时,它首先转换为long long,然后分配给c

c = 12LL;

执行完全相同的赋值,只是不需要先隐式转换。这两个赋值是等价的,没有一个理智的编译器会有所作为。

请注意,某些编码指南,例如 MISRA(用于汽车嵌入式代码)要求分配给无符号类型的常量以 U 为后缀:

例如,在 C 中,两个赋值(这里是 unsigned int x;)是等价的:

 x = 0;   /* non-MISRA compliant */
 x = 0U;

但 MISRA 需要第二种形式(MISRA-C:2004,规则 10.6)。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多