【问题标题】:Why can't I print an unsigned int with printf in C? [closed]为什么我不能在 C 中使用 printf 打印 unsigned int? [关闭]
【发布时间】:2021-03-28 00:58:09
【问题描述】:

对于一个学校项目,我正在尝试用 C 语言重新创建 stdio.h 库的 printf 函数。

我目前正在努力使unsigned int 打印部分正常工作,但由于某种原因,为什么我尝试使用真正的printf 打印一个无符号整数,它给了我一个警告(这被认为是我的学校)。有人能解释一下为什么吗?

这是我使用的代码行:printf("%u\n", 4294967295);。这是我遇到的错误:

main.c:18:17: warning: format specifies type 'unsigned int' but the argument has type 'long' [-Wformat]
        printf("%u\n", 4294967295);
                ~~     ^~~~~~~~~~
                %ld
1 warning generated.

【问题讨论】:

  • 警告很清楚。你不明白哪一部分?
  • 你必须写4294967295U,而不是4294967295
  • 谢谢,解决了。感谢您的帮助。
  • 整数常量的类型不是固定的,依赖于what type can actually represent that value
  • 刚刚取消删除@bruno

标签: c gcc printf long-integer unsigned-integer


【解决方案1】:

整数文字的类型被视为标准中列表中的第一个类型。不带任何后缀的文字列表为intlong intlong long int/unsigned long int。由于 4294967295 不适合 int,因此如果 long 是比 32 位更宽的类型(在您的平台上就是这种情况),它将是 long。要获得 unsigned int 文字,您需要使用 U 后缀

The type of integer constant

整数字面量的类型是值可以适合的第一个类型,来自类型列表,这取决于使用的数字基数和 integer-suffix

整数常量允许的类型:

  • 无后缀
    • 十进制基数:
      • int
      • 长整数
      • unsigned long int(C99 之前)
      • long long int(C99 起)
    • 其他基地:
      • int
      • 无符号整数
      • 长整数
      • unsigned long int
      • long long int(C99 起)
      • unsigned long long int(C99 起)
  • ...

如果整型常量的值太大而无法放入后缀/基数组合所允许的任何类型,并且编译器支持扩展整型类型(例如__int128),则可以给常量赋予扩展整型类型;否则,程序是非良构的。

【讨论】:

  • 这是一种 C++ 答案。 C 没有二进制基数,如果一个数字不适合扩展整数类型,它就没有类型 - 它不是“格式错误”,在 C 中没有所谓的格式错误。
  • @Lundin C23 具有二进制整数文字 en.cppreference.com/w/c/language/integer_constant
  • 还有待观察,该标准仍在开发中。
【解决方案2】:

所有整数常量,例如4294967295,都有一个类型,就像声明的变量一样。 C 编译器根据各种复杂的规则为这样的常量分配一个类型。一个简化的解释是,这些规则基本上可以归结为:

  • “它适合 int 吗?如果适合,请将其设置为 int。”
  • “否则它是否适合long?” ...等等。

请注意,这些默认类型是有符号类型。

在具有 32 位 int 的 32 位计算机上,您可以存储在 int 中的最大数字是 2^31 - 1 = 21474836474294967295 比这个大,所以编译器必须将它存储在 long 中。因此发出警告。

由于4294967295 适合unsigned int,因此您可以通过简单地强制编译器将整数常量视为无符号来修复代码:4294967295u

【讨论】:

    【解决方案3】:

    您似乎正在尝试打印一个无符号整数,但您在printf("%u\n", 4294967295) 中传递的值是长类型。所以你可以尝试将数据类型更改为unsigned long int

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 2011-05-03
      相关资源
      最近更新 更多