A:前言
本文是带大家了解整形提升以及char类型的数值存储范围这个知识点,可能文章篇幅会有些短小
B:隐式类型转换
一.应用场景
一:当参与计算的变量不为同一类型时,会发生转换,以下为相关情况:
1.当两个类型变量字节长度不同时:
为了不丢失精度,类型转换会将短字节的类型转化为另一个长字节的类型
比如:int与long int相加时会将int类型转换为long类型再计算
2.当unsign类型与sign类型相遇时:
会将sign类型转换为unsign类型
3:当赋值运算时,等号两边类型不同时:
会将等号右边的类型转化为等号左边的类型
若右边精度高于左边则会出现数据丢失,丢失的部分按照四舍五入舍去。
二:特殊类型
float类型
由于所有浮点类型都是默认以double类型来计算的,所以float计算时会将其转化为double类型进行计算。
short以及char
整形算数运算都至少以缺省整形精度来进行运算,这是由整形运算在cpu相应的运算器中进行而决定的,而这精度一般为int类型,也就是cpu通用寄存器的长度
所以当short与char参与运算时会率先将它提升至int字节长度,在参与完运算后则会再返回值char/short型。
C:细解char的运算过程中的隐式整形提升
前面讲了char与short类型在运算时会提升字节,而运算完则会返回自己类型,其中我们会发现int类型为4字节,而short类型为两字节,提升前和提升后数据存储的范围与运算过程这部分是我们接下来的详解。
一.整形提升的规则
当我们在char类型与short类型中需要以整型类型打印时,会将char类型何short类型扩大至int型
而提升时:按照符号位补位
例:
当10000001扩大时
会变为
11111111111111111111111110000001
00000001扩大时
则会变为00000000000000000000000000000001
了解了这个接下来可以开始我们的内容了
二.运算时的数据类型转换
char a=3;
char b=127;
char c=a+b;
由于char类型只有一个字节
a的存储为:
00000011
b存储为
01111111
运算时:
将两者扩大至int类型进行运算
即
00000000000000000000000000000011-a
+
000000000000000000000000001111111-b
结果c=00000000000000000000000010000010
计算完,将c转为char类型存储
c的存储:10000010
这里我们发现,存储1的部分变为了符号位这个时候我们若想要打印出c值,会是多少?
printf("%d",c);
这时将100000010按符号位扩大
就变为111111111111111111111111100000010
众所周知,整形存储时一般以补码存储,所以这个时候将其转化为原码
即——100000000000000000000000011111110
打印结果即为-126.
三.char类型存储数值范围
要探索char类型的数值范围,就要从可以挑几个极端值来研究
0000000
00000001
…………
01111110
01111111
以及:
10000000
10000001
…………
11111110
11111111
这里我们就分别来计算其大小
正数就很好计算,将上面四个正数分别计算后发现对于char而言正数的存储范围为0-127
这时计算负数:
10000000发现不好计算为原码,按找我们尝试来说,这里应该表示为-0,但是负零没有意义,所以定义者就把这个设置为了-128
10000001将其-1,并除符号位全部取反
得到11111111即为-127
同理我们可以算出
11111111为-1
11111110为-2
这时我们就可以发现负数范围为:-1 —— -128
这时发现范围即为-128——127
我们也可以用一张图片表示清楚
这里就是char类型范围的循环
D:结尾
这里为大家演示了char类型的数值存储范围的探究方式,关于shrot类型大家如果好奇可以自己去尝试计算一下