文章目录
  1. 1. 算术运算的的隐式转换规则
    1. 1.1. 示例

在算术运算和关系运算中如果参与运算的操作数类型不同,编译系统会自动对数据类型进行转换(隐式转换)

赋值表达式中,右边表达式的值隐式转换为左边变量的类型,并赋值给左边.
函数调用时,隐式将实参转换为形参的类型后,再赋值为形参.

算术运算的的隐式转换规则

  1. 字符型(char)必须先转换为整型(int), (字符类型数据和整型数据之间可以通用)
  2. short型转换为int型
  3. float型数据在运算时一律转换为double型,以提高运算精度(两者同属于实型)

其次,遵循如下规则:
当不同类型的数据进行运算时,应将其转换为相同的数据类型,然后进行操作,转换规则:由低类型转换为高类型数据

1
2
3
4
5
6
float
|
v
char, short -> int -> unsigned -> long -> double
低类型 ---------------------------------> 高类型

示例

例1

1
2
3
4
5
6
7
8
9
10
int a = -1;
unsigned int b = 1;
if (a > b) {
printf("-1(int) > 1(unsigned int)\n");
} else {
printf("-1(int) < 1(unsigned int)\n");
}
执行结果: -1(int) > 1(unsigned int)

原因: 无符号数与有符号数进行比较时,需要将有符号数转换为无符号数后再比较。a转换为无符号数后是0xFFFFFFFF, 肯定大于b

例2

1
2
3
4
5
6
7
8
9
10
char a = -1;
unsigned char b = 1;
if (a > b) {
printf("-1(char) > 1(unsigned char)\n");
} else {
printf("-1(char) < 1(unsigned char)\n");
}
执行结果: -1(char) < 1(unsigned char)

原因: 因为a和b都被转换为int型了, 所以a < b
而不是和例1一样,将char转换为unsigned char

例3:

1
2
3
4
5
6
7
8
9
char a = -1;
unsigned char b = -1;
printf("-1(char): 0x%x\n", a);
printf("-1(unsigned char): 0x%x\n", b);
执行结果:
-1(char): 0xffffffff
-1(unsigned char): 0xff

文章目录
  1. 1. 算术运算的的隐式转换规则
    1. 1.1. 示例