考虑以下程序,
#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,不改变值。