一些数据类型,例如char,short int所占用的字节数少于int,当对它们执行操作时,这些数据类型会自动提升为int或unsigned int。这称为整数提升。例如,在较小的类型(如char,short和enum)上不会进行算术计算。首先将它们转换为int或unsigned int,然后对它们进行算术运算。如果int可以表示原始类型的所有值,则该值将转换为int。否则,它将转换为无符号整数。
![69ca749682e37fa58cc2a99e670f9095.png](https://img-blog.csdnimg.cn/img_convert/69ca749682e37fa58cc2a99e670f9095.png)
例如,请参见以下程序。
#include 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 int main() { char a = 0xfb; unsigned char b = 0xfb; printf("a = %c", a); printf("b = %c", b); if (a == b) printf("Same"); else printf("Not Same"); return 0; }当我们打印“ a”和“ b”时,将打印相同的字符,但是当我们比较它们时,我们得到的输出为“不相同”。'a'和'b'与char具有相同的二进制表示形式。但是,当对“ a”和“ b”执行比较操作时,它们首先被转换为int。'a'是一个有符号的char,当将其转换为int时,其值变为-5(有符号的值0xfb)。'b'是无符号char,当将其转换为int时,其值变为251。值-5和251具有不同的int表示形式,因此我们得到的输出为“ Not Same”。当我们打印“ a”和“ b”时,将打印相同的字符,但是当我们比较它们时,我们得到的输出为“不相同”。'a'和'b'与char具有相同的二进制表示形式。但是,当对“ a”和“ b”执行比较操作时,它们首先被转换为int。'a'是一个有符号的char,当将其转换为int时,其值变为-5(有符号的值0xfb)。'b'是无符号char,当将其转换为int时,其值变为251。值-5和251具有不同的int表示形式,因此我们得到的输出为“ Not Same”。
当我们打印“ a”和“ b”时,将打印相同的字符,但是当我们比较它们时,我们得到的输出为“不相同”。
'a'和'b'与char具有相同的二进制表示形式。但是,当对“ a”和“ b”执行比较操作时,它们首先被转换为int。'a'是一个有符号的char,当将其转换为int时,其值变为-5(有符号的值0xfb)。'b'是无符号char,当将其转换为int时,其值变为251。值-5和251具有不同的int表示形式,因此我们得到的输出为“ Not Same”。