printf redifines UINT32_MAX

Mat*_*mbo 4 c printf

码:

#include <stdio.h>
#include <stdint.h>

int main(int argc, char *argv[]) {
    printf("%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n",
        UINT32_MAX,
        UINT32_MAX,
        UINT32_MAX,
        UINT32_MAX,
        UINT32_MAX,
        UINT32_MAX,
        UINT32_MAX);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

4294967295
4294967295
4294967295
4294967295
4294967295
18446744073709551615
18446744073709551615
Run Code Online (Sandbox Code Playgroud)

bug还是故意的?为什么?我认为它说明了一切,但接口需要我添加更多的行才能发布它(为了更少的文本来解决很多代码)

Die*_*Epp 14

你正在使用%lu,这是不正确的.该%lu说明符是unsigned long unsigned long,没有uint32_t.这就是输出不正确的原因.请PRIu32改用.

如果您在启用警告的情况下进行编译,则编译器应该已经为您捕获了此错误.

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h> // defines PRIu32

printf(
    "%" PRIu32 "\n"
    "%" PRIu32 "\n"
    "%" PRIu32 "\n"
    "%" PRIu32 "\n"
    "%" PRIu32 "\n"
    "%" PRIu32 "\n"
    "%" PRIu32 "\n",
    UINT32_MAX,
    UINT32_MAX,
    UINT32_MAX,
    UINT32_MAX,
    UINT32_MAX,
    UINT32_MAX,
    UINT32_MAX);
Run Code Online (Sandbox Code Playgroud)

在实践中,在大多数系统中PRIu32定义"u".