1、整数提升(Integer Promotion)
C语言在处理较小的整数类型(如 char
和 short
)时,会将它们自动提升为 int
类型,以便进行计算。这就是所谓的整数提升。规则是所有小于 int
大小的整数类型(如 char
, short
, bool
等)会被提升为 int
,如果 int
不能表示原类型的值范围,则提升为 unsigned int
。
#include <stdio.h>
int main() {
char a = 5;
char b = 10;
int result = a + b; // a 和 b 被提升为 int 进行计算
printf("Result: %d\n", result);
return 0;
}
2、通用算术转换(Usual Arithmetic Conversions)
当表达式中包含不同类型的操作数时,C语言会将它们提升为一个公共类型,使得计算结果准确。这些规则称为通用算术转换。
1)如果操作数包含 long double
,其他操作数会被提升为 long double
。
2)否则,如果操作数包含 double
,其他操作数会被提升为 double
。
3)否则,如果操作数包含 float
,其他操作数会被提升为 float
。
4)否则,如果操作数包含 unsigned long long
,所有操作数会被提升为 unsigned long long
。
5)否则,如果操作数包含 long long
,所有操作数会被提升为long long
。
以此类推,直到 int
类型。
#include <stdio.h>
int main() {
int a = 5;
float b = 2.5;
float result = a + b; // a 被提升为 float 进行计算
printf("Result: %f\n", result);
return 0;
}
3、整数类型的不同情况
在整数操作中,C语言会根据类型的符号(有符号或无符号)和大小决定转换规则。规则是如果两者的类型大小相同,但一个是有符号类型、一个是无符号类型,则无符号类型优先。如果有符号类型的大小较大,则转换为有符号类型。
#include <stdio.h>
int main() {
unsigned int a = 5;
int b = -10;
if (a + b > 0) {
printf("Positive\n");
} else {
printf("Negative\n");
}
return 0;
}
4、避免隐式类型提升导致的错误
隐式类型提升在混合类型运算中很常见,但如果不注意,可能会导致未预料的行为。特别是在有符号与无符号类型的混合运算中,错误容易出现。
#include <stdio.h>
int main() {
unsigned int a = 1;
int b = -2;
if (a + b > 0) {
printf("Positive\n");
} else {
printf("Negative\n"); // 可能输出 Negative,但不符合预期
}
return 0;
}