【问题标题】:Warning this decimal constant is unsigned only in ISO C90警告这个十进制常量仅在 ISO C90 中是无符号的
【发布时间】:2017-01-10 00:28:32
【问题描述】:
#include<stdio.h>

int main(void) {

    int t;
    long long n = 4294967295;
    //printf("%lu",n);
    return 0;
}

每当我运行上述代码时,编译器都会显示以下警告

[警告] 这个十进制常量仅在 ISO C90 中是无符号的

我的代码有什么问题?

【问题讨论】:

  • print 附带的警告是否被注释掉了?因为常量的提及与传递给printf的变量无关。
  • 可能是C90的规则不同。 I 标准 C (C11),没有 u 后缀的十进制文字始终是有符号类型,而十六进制和八进制文字在有符号和无符号类型之间交替。 (也许这曾经也是十进制文字的行为?)
  • 4294967295 是一个unsigned int,一些旧的编译器可能会反对,你可以试试4294967295ll
  • @chux 我想知道这条消息。我看到一切都很好,对我来说似乎是一个无效的警告。我们应该知道使用的警告设置。如果将LL 常量分配给较小的类型,则正确的警告是,但这里一切都很好(只要printf 被注释掉)。
  • @olaf 同意。我们缺少的是什么编译器,它的版本和设置是未知的。

标签: c


【解决方案1】:

在 ISO C 中,4294967295 的行为在 C90 和 C99 之间发生了变化。

在 C90 中,在普通系统上,这是一个无符号值,unsigned int(在 32 位系统上)或 unsigned long(在 16 位系统上)。但是在 C99 中,这是在这些系统上签名的 long long

您可以禁用此警告,或使用整数后缀来表明您了解该问题,例如4294967295LL.

【讨论】:

  • 不明显的建议是使用4294967295U 来获得无符号类型吗?宽度从来都不是问题,因为它会根据需要自动调整。签名是问题的关键。
  • @KerrekSB 有多种方法...目的是为long long设置一个值,因此使用相应的后缀似乎很自然。禁用警告实际上是我的首选解决方案(而是对超出范围的转换发出警告)
  • 哦,我明白了,用例是初始化一个long long。嗯,这是一个愚蠢的警告。我希望它不应该以迂腐的标准模式出现。 (我认为超出范围不是警告,而是格式错误。)
  • @KerrekSB 超出范围的文字格式不正确;我的意思是像 OP 这样正确的代码应该不会收到警告,但是例如 int x = 4294967295; ,它是实现定义的,应该收到警告,使得文字没有必要有自己的警告
  • const 不会使对象成为 C 中的常量。C 没有像 C++ 那样的符号常量。
【解决方案2】:

对于long long int,需要%lld格式说明符:

long long n = 4294967295;
printf("%lld", n);

对 long long int 类型使用错误的格式说明符 %lu 会导致未定义的行为。

【讨论】:

  • 我阻止了 printf 语句 //
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多