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

时间:2017-03-15 20:26:21

标签: c

我正在做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的所有内容相矛盾。

真的希望有人清除对此的困惑。

3 个答案:

答案 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);