我正在做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中读到的所有内容相矛盾.
真的希望有人能解决这方面的困惑.
正如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我添加的空格以便于阅读).