我在做 K&R C 的问题 2.1,它基本上是想让我们弄乱并理解头库
#include<stdio.h>
#include<limits.h>
#include<float.h>
int main()
{
printf("%lu", ULONG_MAX);
}
当我运行这个程序时,我得到了输出
4294967295
等于 232 -1。我期待这个值(因为 K&R 在其附录中具有相同的值)。
现在我将 %lu
更改为 %llu
。
根据我对 C 语言的了解,我假设 %llu
是 ULONG_MAX
值的更大“占位符”。
我希望得到相同的输出,但我却得到了一个模糊的输出
38654705663
ULONG_MAX
不应该是一个常量吗?为什么会发生变化?
另外,为了寻求答案,我偶然发现了 this .
我理解标准提到术语“最小”的论点,但是当我用 CHAR_MAX
测试它时(即尝试用 %llu 打印
说明符),我得到了 CHAR_MAX
38654705663
这与我在 C 中读到的有关 char
的所有内容都是矛盾的。
真的希望有人消除对此的困惑。
最佳答案
由于 printf
现在期望打印 64 位值,因此您应该相应地传递它。您可以将其转换为 unsigned long long
:
printf("%llu", (unsigned long long)ULONG_MAX);
假设一个小端架构,你之前得到了更大的值,因为只有最低有效的 32 位字作为参数传递,而 printf 需要 64 位,所以它被用作最高有效的 32 位字,无论包含在下一个地址的堆栈。
你得到的错误值是 38654705663。如果你以十六进制显示它(你也可以使用 printf
和 %llx
),你会得到:
0000 0008 FFFF FFFF
(我添加的空格以便于阅读)。
关于c - 为什么数据类型的最大值显示出荒谬的高值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42820021/