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

标签 c

我在做 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 语言的了解,我假设 %lluULONG_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/

相关文章:

c++ - 这是合法的 C++ 代码吗?

c - 在 memcpy 期间取消引用 void * 指针,想知道如何解决这个问题?

c - 3D数组如何存储在C中?

c - 了解 CPU 缓存和缓存行

c - 使用指向c中指针变量的指针将二维数组传递给函数

c - 运行 shellcode 可在调试器中运行,但不能单独运行

c - 在链表上使用 strtok()

c++ - 将指针传递给函数

将字符串复制到 char 数组中

c - 包装 open() 进行单元测试将使 gcov 无法打开 gcda 文件