为什么我不能在 C 中使用 printf 打印 unsigned int?

Why can't I print an unsigned int with printf in C?

对于一个学校项目,我正在尝试用 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.

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

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

The type of integer constant

The type of the integer literal is the first type in which the value can fit, from the list of types which depends on which numeric base and which integer-suffix was used.

Types allowed for integer constants:

  • no suffix
    • decimal bases:
      • int
      • long int
      • unsigned long int (until C99)
      • long long int (since C99)
    • other bases:
      • int
      • unsigned int
      • long int
      • unsigned long int
      • long long int (since C99)
      • unsigned long long int (since C99)
  • ...

If the value of the integer constant is too big to fit in any of the types allowed by suffix/base combination and the compiler supports extended integer types (such as __int128), the constant may be given the extended integer type; otherwise, the program is ill-formed.

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

  • “它适合 int 吗?如果适合,那就 int”。
  • “否则它是否适合 long?” ...等等。

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

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

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