目录
一、整型提升
1.什么是整型提升?
整型提升是C语言中的一项规则,C语⾔中整型算术运算总是以默认整型类型的精度来进行计算的。
为了获得这个精度,在进行表达式中的字符型和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整型提升。
2.整型提升的意义
- 表达式的整型运算要在CPU(中央处理器)的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度⼀ 般就是int的字节长度,同时也是CPU的通用寄存器的长度。
- 因此,若有两个char类型的相加时,在CPU中执行的时候,实际上也要先转换为CPU内整型操作数的标准长度。
- 通⽤CPU(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中 可能有这种字节相加指令)。所以,表达式中各种长度可能⼩于int⻓度的整型值,都必须先转换为 int或unsigned int,然后才能送入CPU去执行运算。
3.整型提升的规则
对于有符号类型和无符号类型时不同的。
- 1. 有符号类型的提升是按照变量的数据类型的符号位来提升的
- 2. 无符号类型的提升,高位补0
4.整型提升的示例
(1)有符号类型的提升
a.正数:
char a = 1;
1是整型,它的二进制补码是“00000000 00000000 00000000 00000001”,这有32个比特位,它要存入只有8个比特位的char型的变量a中,首先需要发生截断,变成“ 00000001 ”,这样才能存入a中去。所以a中存的就是:“ 00000001 ”
因为char是有符号char类型,所以要高位补符号位“0”,则整型提升后就为:“00000000 00000000 00000000 00000001”
b.负数:
char b = -1;
-1是整型,它是负数,
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
所以它的二进制补码是“11111111 11111111 11111111 11111111”,这有32个比特位,它要存入只有8个比特位的char型的变量b中,首先需要发生截断,变成“ 11111111 ”,这样才能存入b中去。所以b中存的就是“ 11111111 ”。
因为char是有符号char类型,所以要高位补符号位“1”,则整型提升后就为:“11111111 11111111 11111111 11111111”。
(2)无符号类型的提升
a.正数:
unsigned char c = 1;
1存入c后,c中存的就是“00000001”。
因为这里是无符号char类型,所以整型提升是要高位补“0”,
即:“00000000 00000000 00000000 00000001”。
b.负数:
unsigned char d = -1;
-1存入d后,d中存的就是:“ 11111111 ”。
因为这里是无符号char类型,所以整型提升是要高位补“0”,
即:“00000000 00000000 00000000 11111111”。
只有当它们都整型提升后才能进行算数运算
二、算术转换
1.什么是算术转换?
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类 型,否则操作就无法进行。
所以在某个操作符的各个操作数属于不同的类型,其中一个操作数的转换为另一个操作数的类型,这就是算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int
规则:
- 如果某个操作数的类型在上面这个列表中排名靠后,那么首先要这个操作数转换为另外一个操作数的类型后才执行运算
注意:
算术转换要合理,否则也会出现一些问题。
如:
double f = 3.14;
int num = f;//隐式转换,会有精度丢失
2.示例
int a = 1;
double b = 3.14;
若执行a+b,由于在上数列表中排名靠后,所以要将int类型转话未double类型,才进行计算。