目录
整型提升
间接证明整型提升的代码案例
算术转换
整型提升
何为整型提升:
C语言的整型算术运算总是至少以缺省(默认)整型类型的精度来进行的
为了获得这个精度,表达式中的字符类型和短整型操作数在使用之前被转换为普通整型(int类型),这种传唤就被称为整型提升
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度-般就是int的字节长度,同时也是CPU的通用寄存器的长度
因此,即使两个char类型或者short类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度
如何进行整型提升呢?
整型提升是按照变量的数据类型的符号位来提升的
当符号位是1时,整型提升时高位补全符号位1
当符号位是0时,整型提升时高位补全符号位0
代码举例:
#include<stdio.h>
int main()
{char c1 = 5;char c2 = 127;char c3 = c1 + c2;printf("%d\n", c3);return 0;
}
c3以%d的形式打印的结果为多少呢,以及c1和c2在相加时是如何整型提升的呢?
代码分析:
常量5和17分别存储在char类型的变量c1和c2中的补码(char长度为1字节):
若常量的值大于了char类型能存放的最大值,就会发生截断
c1和c2整型提升后的补码(按符号位整型提升):
c1 + c2; c1和c2整型提升后相加的补码存放在c3中:
char c3 = c1 + c2; c3是char类型变量,所以存放时会发生截断:
printf("%d\n", c3); %d是以十进制的形式打印有符号的整数
那么c3在以%d的形式打印时又会发生整型提升(按符号位整型提升):
c3的二进制原码转换为十进制为:1*2^2 + 1*2^3 + 1*2^4 + 1*2^5 + 1*2^6 = 124
且c3的最高位(符号位)为1,所以c3以%d的形式打印的结果为:-124
代码验证:
注意:无符号的数据类型整型提升时,高位补全直接补0
间接证明整型提升的代码案例
代码案例1:
#include<stdio.h>
int main()
{char a = 0xb6;short b = 0xb600; int c = 0xb6000000; if (a == 0xb6)printf("a");if(b == 0xb600)printf("b");if(c == 0xb6000000)printf("c");return 0;
}
0x --- 以0x开头的数字表示这是一个十六进制的数字
十六进制中的b表示的是11,转换为二进制为:1011
一个十六进制的数字表示4个bit
char a = 0xb6; --- 两个十六进制的数字为8bit,刚好填满char类型的a,且不会发生进位
short b = 0xb600; --- 四个十六进制的数字为16bit,刚好填满short类型的b,且不会发生进位
当 if (a == 0xb6) 和 if(b==0xb600) 比较判断时,就会发生算术运算,那么就必然会发生整型提升
所以 char类型的a 和 short类型的b 就会发生整型提升,a和b的最高位都是1,所以整型提升后的结果就会发生改变,自然判断就不会全等
而int c = 0xb6000000; int类型的c不会发生整型提升,所以判断会全等,则打印的结果为c
代码验证:
代码案例2:
#include<stdio.h>
int main()
{char c = 1;printf("%u\n", sizeof(c));printf("%u\n", sizeof(+c));printf("%u\n", sizeof(-c));return 0;
}
%u --- 以十进制的形式打印无符号整数
sizeof(c):毫无疑问结果为1字节,以为c为char类型,char的长度为1字节
sizeof(+c) 和 sizeof(-c):正和负表示算术运算,只要cher类型和short类型的数据参与运算,就会发生整型提升,提升为int类型,所以sizeof(+c) 和 sizeof(-c)计算的结果为4
代码验证:
算术转换
何为算术转换?
如果某个操作符的各个操作数属于不同的类型(只包括大于等于int类型的类型,也就是说大于等于4个字节),那么除非其中一个操作数的转换为另一个操作数的类型(向上转换,小的字节类型转换为大的字节类型),否则操作就无法进行
举例说明:
double d = 3.14159;int n = 10;d + n;
当 double类型的d 和 int类型的n 算术运算时,就会把 int类型的n 向上转换为 double类型 再进行运算
注意:只是在运算时把 int类型的n 向上转换为 double类型 ,并不会改变n的类型