我正在做K& R C的问题2.1,基本上我们要乱搞并理解标题库
#include<stdio.h>
#include<limits.h>
#include<float.h>
int main()
{
printf("%lu", ULONG_MAX);
}
当我运行这个程序时,我得到了输出
4294967295
等于2 32 -1。我期待这个值(因为K&amp; R在它的附录中具有相同的值)。
现在我将%lu
更改为%llu
。
由于我对C语言知之甚少,我假设%llu
对于ULONG_MAX
的值来说是一个更大的“占位符”。
我希望获得相同的输出,但我得到了一个模糊的输出
38654705663
ULONG_MAX
不应该是常数吗?为什么会改变?
另外,为了寻求答案,我偶然发现了this。
我理解标准提到术语“最小”的论点,但当我用CHAR_MAX
测试时(即尝试使用CHAR_MAX
说明符打印%llu
),我得到了< / p>
38654705663
这与我在C中读过char
的所有内容相矛盾。
真的希望有人清除对此的困惑。
答案 0 :(得分:5)
由于printf
现在期望打印64位值,因此应该相应地传递它。您可以将其投射到unsigned long long
:
printf("%llu", (unsigned long long)ULONG_MAX);
假设有一个小端架构,之前你得到了更大的值,因为只有最不重要的32位字作为参数传递,而printf需要64位,所以它用作最重要的32位字,无论是什么堆栈包含在下一个地址。
你得到的错误值是38654705663.如果你用十六进制显示它(你也可以使用printf
来使用%llx
),你得到:
0000 0008 FFFF FFFF
(我添加的空格以便于阅读)。
答案 1 :(得分:4)
其他printf()
参数的类型必须匹配使用过的占位符。否则行为未定义。
%llu
代表unsigned long long
,因此您的参数也必须为unsigned long long
:
printf("%llu", (unsigned long long)ULONG_MAX);
答案 2 :(得分:2)
使用%llu
,您必须将长整数传递给printf()
。试试这个:
printf("%llu", (unsigned long long)ULONG_MAX);