【发布时间】:2019-01-03 03:00:42
【问题描述】:
考虑以下程序,
#include <stdio.h>
int main()
{
char a = 130;
unsigned char b = 130;
printf("a = %d\nb = %d\n",a,b);
return 0;
}
此程序将显示以下输出。
a = -126
b = 130
我的问题是printf() 函数如何知道a 的类型是有符号的,b 的类型是无符号的以显示上述结果?
【问题讨论】:
-
char 可能在 [-128, 127] 范围内有效,因此 130 溢出。您的编译器会针对此类问题向您发出警告。
-
printf函数不知道你传递了什么。它相信你告诉它的格式。只有聪明的编译器才能发现错误。 -
char可以是unsigned或signed并且它纯粹是特定于实现的,在你的情况下虽然是signed这就是为什么当你打印超过127时它会溢出 -
printf不知道,它相信格式说明符%u或%d -
@FelixPalmen 不会整数提升将
unsigned char转换为unsigned int?我认为整数促销会保留标志。