printf()函数如何知道其参数的类型

Aji*_*nan 1 c printf gcc

考虑以下程序,

#include <stdio.h>
int main()
{
    char a = 130;
    unsigned char b = 130;

    printf("a = %d\nb = %d\n",a,b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序将显示以下输出。

a = -126
b = 130
Run Code Online (Sandbox Code Playgroud)

我的问题是printf()函数如何知道如上所示的带符号的a类型和b无符号的类型?

小智 5

printf() 知道类型,这就是为什么您必须提供正确的格式字符串的原因。的原型printf()如下所示:

int printf(const char * restrict format, ...);
Run Code Online (Sandbox Code Playgroud)

因此,唯一已知类型的参数是第一个参数,即格式字符串。

这也意味着在此之后传递的任何参数都将受到默认参数提升的限制 -进行了简化,将其读取为至少 将转换为任何整数的任何参数int-或向google询问该术语以了解每个细节;)

在您的示例中,您具有实现定义的行为

char a = 130;
Run Code Online (Sandbox Code Playgroud)

如果char可以代表的话130,那就是在输出中所看到的printf()。将值提升为int不会改变值。您会得到一个负数,这意味着130您的溢出了char。四溢一个结果签署在C转换期间整数类型实现定义,你可能得到的手段的价值,你的机器上,char有8位(因此最大值127)和符号整数溢出导致了环绕到负值范围。您不能依靠这种行为!

简而言之,在该行中创建了负数- 130类型为int,将其分配给它进行char转换,并且该转换溢出。

一旦你char拥有的价值-126,将它传递给printf()刚刚将其转换为int,不改变值。