有些数据类型(如char、short int)占用的字节数比int少,当对这些数据类型执行操作时,它们会自动升级为int或unsigned int。这称为整数提升。例如,在char、short和enum等较小类型上不会进行算术计算。首先将它们转换为int或unsigned int,然后对它们进行算术运算。如果int可以表示原始类型的所有值,则该值将转换为int。 否则,它将转换为unsigned int。
例如,请参见以下程序。
#include <stdio.h>
int main()
{
char a = 30, b = 40, c = 10;
char d = (a * b) / c;
printf ("%d ", d);
return 0;
}
输出:
120
乍一看,表达式(a*b)/c似乎会导致算术溢出,因为有符号字符的值只能从-128到127(在大多数c编译器中),而子表达式(a*b)的值是1200,大于128。但在对char类型进行算术运算时发生了整数提升,我们在没有任何溢出的情况下得到适当的结果。
下面的程序是另一个示例。
#include <stdio.h>
int main()
{
char a = 0xfb;
unsigned char b = 0xfb;
printf("a = %c", a);
printf("\nb = %c", b);
if (a == b)
printf("\nSame");
else
printf("\nNot Same");
return 0;
}
输出:
a = ?
b = ?
Not Same
当我们打印“ a”和“ b”时,将打印相同的字符,但是当我们比较它们时,我们得到的输出为“Not Same”。
当作为char格式时,“ a”和“ b”具有相同的二进制表示形式。 但是,当对“ a”和“ b”执行比较操作时,它们首先会转换为int。“a”是一个带符号的字符,当将其转换为int时,其值变为-5(带符号的值0xfb)。“b”是无符号字符,当将其转换为int时,其值变为251。值-5和251具有不同的int表示形式,因此我们得到的输出为“Not Same”。
参考文档
[1]Abhay Rathi.Integer Promotions in C[EB/OL].https://www.geeksforgeeks.org/integer-promotions-in-c/,2017-05-28.