对 C 中 %d 和 %ld 以及 %lld 和 %u 的边界感到困惑

标签 c

查看以下在 visual studio 2012 中编译的代码。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    long long end1 = 12345678908642;

    long end2 = 65537;

    printf("end1 = %lld and %u\n" , end1 , end1); // line a

    printf("end2 = %d and %ld and %u\n" , end2 , end2 , end2); // line b

    printf("end2 = %d and %ld and %lld and %u\n" , end2 , end2 , end2 , end2); // line c

    system("pause");
    return 0;
}

Q1:我以为在a行,%lld和%u显示的两个数字是一样的,其实不一样,但为什么在b行,%u显示的是正确的数字?

Q2:在c行,%lld和%u显示的数字不对,为什么?我认为它们应该像 %d 和 %ld 一样。

我很困惑。

最佳答案

转换说明符(如 %u)必须匹配作为参数给出的相应值的类型。

printf 使用可变参数列表。整数提升后,实际参数被压入函数堆栈,但被调用者不知道每个实际参数的偏移量 (printf);这些偏移量是从格式字符串中重建的。

因此,如果您认为所有实际参数首先由调用者连接并由具有不同偏移量的被调用者 (printf) 读取(根据转换说明符,这与实参)。

关于对 C 中 %d 和 %ld 以及 %lld 和 %u 的边界感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31856361/

相关文章:

c - 为什么在 glibc 中不推荐使用 'sys_errlist'?

C winapi hwnd返回空值

c - -funsafe-math-optimizations 中包含哪些优化?

c - C 中的运算符 sizeof()

c++ - 使用 Opencv Mat 的可视化像素

c - 如何在 Linux 内核中创建多个僵尸?

C 指针的问题

c - 程序返回错误答案和 "-nan(ind)"。我做错了什么?

c++ - 如何摆脱使用但未定义的标签

c - 指向数组地址的结构指针