隐式类型转换
-
隐式类型转换
- C的整型算数运算总是至少以缺省类型的精度来进行的
整型提升
为了获得这精度,表达式中的字符和短整型操作数在使用之前被转换为普通类型,这种转换被称为整型提升。
如何提升
先转换成其补码,然后按照数据类型的符号来提升的(除值外,其他值补符号位值)
-1
1000 0001 原码
1111 1110 反码
1111 1111 补码
1111 1111 1111 1111 1111 1111 1111 1111 整形提升(补码)
何时需要整型提升
在进行short/char类型进行算术运算时,先进行整型提升,再进行算术运算。
意义
- 表达式的整形运算要在CPU的相应运算器件内执行,CPU内整形运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU通用寄存器的长度。
- 因此,即两个char类型相加,在CPU执行时实际上也要先转换CPU内整型操作数的标准长度.
- 通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须转为int或unsigned int,然后才能送入CPU去执行运算
例题:
- 例题1
//整型提升例题
//00000011 a 的补码
char a = 3;
//01111111 b的补码
char b = 127;
// a + b 先将a 和 b转换成int型
//00000000 00000000 00000000 00000011 -(int类型) a
//00000000 00000000 00000000 01111111 -(int类型) b
//00000000 00000000 00000000 10000010 -(int类型) a+b
//因为 变量“c”是char类型,只能存储1个字节,
//所以需要从a+b的结果中截取一个字节(8个比特位)的数据作为变量”c“的值。
//10000010 -(char类型) c
char c = a + b;
//因为需要以十进制的方式输出字符类型的c。需要整型提升。
//10000010 因为符号位为1,所以按照符号位填充
//11111111 11111111 11111111 10000010 -(int 类型) c --补码
//11111111 11111111 11111111 10000001 -(int 类型) c --反码 补码-1是反码 反码+1是补码
//10000000 00000000 00000000 01111110 -(int 类型) c --源码
// -126 c
printf("%d" , c);
- 例二
char a