整形提升

表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定

同样,有些表达式的操作在求值的过程中可能需要转换为其他类型

隐式类型转换–也就是偷偷转换(我们看不见得转化)

C的整形算术运算总是至少以缺省整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前转换成普通整形,这种转换称为整形提升

整形提升的意义:(为什么存在有整型提升?)

表达式的整形运算要在CPU的相应运算器件内执行,CPU内整形运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU通用的寄存器的长度。

因此,即是两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整形操作数的标准长度。

#include<stdio.h>
int main()
{
	char a = 127;
	char b = 3;
	char c = a + b;
	//00000000000000000000000001111111  --a的32位形式下的存储
	//00000000000000000000000001000011  --b的32位形式下的存储
	//但是a和b都是char类型的,char之由一个字节,所以a,b为:
	//01111111  --a
	//00000011  --b
	//字符在算的时候都达不到整形的大小,所以要先把他们提升成整形的大小,然后再进行运算
	//a,b均为有符号的char类型,所以最高位是符号位
	//所以需要把a首先补成这个样子,00000000000000000000000001111111
	//b是同理,b变成了,00000000000000000000000001000011
	//将a和b进行相加:
	//00000000000000000000000001111111
	//00000000000000000000000001000011
	//00000000000000000000000010000010   ---a和b相加的结果
	//a+b的结果要存在c里面,只能存在有8个比特位,结果为10000010
	//对c进行整形提升,要补的是符号位,补完的结果如下所示:
	//11111111111111111111111110000010 ---再内存中放的是补码,打印的是原码
	//补码-1是反码
	//反码为:11111111111111111111111110000001
	//原码为:10000000000000000000000001111110  --结果为-126
	printf("%d", c);   //---126
	return 0;
}
//无符号数进行提升的时候,只能补0
char所能表示的范围:-128~+127

在这里插入图片描述
在这里插入图片描述
(RAND_MAX的值为32767,为short类型所能表示的最大值)

char
在这里插入图片描述
127+3,显而易见就是-126

#include<stdio.h>
int main()
{
	char a = 0xb6;//11000110
	short b = 0xb600;
	int c = 0xb6000000;
	if(a==0xb6)
		printf("a");
	if(b==0xb600)
		printf("b");
	if(c==0xb6000000)
		printf("c");
	system("pause");
	return 0;
}
//打印的结果为c
//另外两个都发生整形提升了
#include<stdio.h>
 int main()
 {
 	char c = 1;
 	printf("%u\n", sizeof(c));//1
 	printf("%u\n", sizeof(+c));//4
 	printf("%u\n", sizeof(!c));//4
 	return 0;
 }
//+c和!c都需要进行运算,进行运算就会发生整形提升,那么就变成int类型了
//sizeof(int) ,结果就是4无疑了。

无符号整数进行提升,高位补的是0

有符号整数进行提升,高位补的是符号位,正数位0,负数为1;

发布了36 篇原创文章 · 获赞 48 · 访问量 5546

猜你喜欢

转载自blog.csdn.net/weixin_43831728/article/details/104069902