在C语言中,算术转换是指在进行算术运算时,编译器会将不同类型的操作数转换成同一类型,然后再进行运算。规则如下:
在表达式中,比 int 小的类型会先转换成 int再计算,然后再将结果转化为原有的类型。比int 大的类型,Int类型的变量会先转化为大的类型再计算。
如 char a = 2 char b = 3
00000010 00000011 整型提升
0000…00010 000…00011
结果相加后,截取8位二进制。所以这就是为什么ASCII只有 2^7-1,即127个。超过这个数字,整形提升后,结果就会错误。
1. 整型提升
- 所有比int小的整型(如char、short)在进行算术运算或使用这个数据时都会先转换为int类型。这是因为 CPU处理int类型数据的效率通常较高。例如,在计算 char a = 10; short b = 20; a + b 时,a和b都会先转换为int类型,再进行相加。
数据在进行整形提升时,原数据为有符号整型,高位补位该数据在存储时的符号位。
例如 char a = 128 printf(“%u”,a);
00000000000000000000000010000000
补码和原码相同,截断时截的是补码
10000000
打印时先整形提升,补的是符号位1
1111111111111111111111111111111110000000
最终结果就按这个计算
这就是为什么char类型字符(不管输入多大的字符,都会在整型提升和存储成char类型字符下进入此循环)
0→…→127→-128→…→-1→0这样一个循环了(逆循环一样)
2. 有符号和无符号整数之间的转换
- 当一个有符号整数和一个无符号整数进行运算时,有符号整数会被转换为无符号整数。比如,在计算 unsigned int a = 10; int b = -5; a + b ,b会被转换为无符号整数,然后再相加,这可能会导致意外的结果,因为-5在无符号数表示下是一个很大的值。
3. 整数和浮点数之间的转换
- 如果一个操作数是浮点数,另一个是整数,整数会被转换为浮点数,运算将以浮点数的规则进行。例如,在计算 int a = 5; float b = 2.5; a + b ,a会转换为浮点数,然后再相加。
4. 同类型不同精度的转换
- 在两个不同精度的同类型操作数(如float和double)进行运算时,较低精度的操作数会转换为较高精度的操作数。例如,在计算 float a = 3.14; double b = 2.71828; a + b ,a会转换为double类型,然后进行相加。