为什么数据类型的最大值显示出荒谬的高值?

Kar*_*ngh 3 c

我正在做K&R C的问题2.1,它基本上要我们搞乱并理解标题库

#include<stdio.h>
#include<limits.h>
#include<float.h>

int main()
{
    printf("%lu", ULONG_MAX);
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,我得到了输出

4294967295
Run Code Online (Sandbox Code Playgroud)

等于2 32 -1.我期待这个值(因为K&R在它的附录中具有相同的值).

现在我改%lu%llu.

由于我对C语言知之甚少,我认为这%llu是一个更大的"占位符" ULONG_MAX.

我希望得到相同的输出,但我得到一个模糊的输出

38654705663
Run Code Online (Sandbox Code Playgroud)

ULONG_MAX应该是一个常数吗?为什么会改变?另外,在寻求答案时,我偶然发现了这一点.

我理解标准提到"最小"这个术语的论点,但是当我测试它时CHAR_MAX(即试图CHAR_MAX%llu说明符打印),我得到了

38654705663
Run Code Online (Sandbox Code Playgroud)

这与我char在C中读到的所有内容相矛盾.

真的希望有人能解决这方面的困惑.

nnn*_*nnn 5

正如printf期望打印64位值,您应该相应地传递它.你可以把它投射到unsigned long long:

    printf("%llu", (unsigned long long)ULONG_MAX);
Run Code Online (Sandbox Code Playgroud)

假设有一个小端架构,之前你得到了更大的值,因为只有最不重要的32位字作为参数传递,而printf需要64位,所以它用作最重要的32位字,无论堆栈包含什么下一个地址.

您得到的错误值是38654705663.如果您以十六进制显示它(您也可以使用printf%llx),您会得到:( 0000 0008 FFFF FFFF我添加的空格以便于阅读).