c语言的整形提升

大家好,很高兴能给大家带来一篇整形提升的文章。

C的整型算术运算总是⾄少以缺省整型类型的精度来进⾏的。为了获得这个精度,表达式中的字符和短整型操作数在使用前被转换为普通整型,这种转换就叫做整型提升。

这个整形提升的定义大家也是看的懵的。下面就让我给大家举例子,让大家更方便的去理解吧

char a=3;
char b=127;
char c=a+b;
printf("%d",c);//结果是-126

很多人会问为什么是-126呢,不应该是130么,那是因为char类似只有8比特位,其余的需要整形提升,补足32比特位,因为%d是打印10进制整形。也就是

3----00000011               

127----01111111             

进行相加

变成10000010

然后进行整形提升,补符号位11111111111111111111111110000010(补码)

11111111111111111111111110000001(反码)

100000000000000000000011111110(原码),符号位不变,按位取反        结果  -126

char d=3;
sizeof(d);//结果 1
sizeof(+d);//结果 4
sizeof(-d);//结果 4

第一个不用多说,都知道算的是c这个变量的所占内存空间的大小,因为是char类型的,所以大小是1 。

第二个、第三个和第四个运行结果是4,是因为c在其中参与了运算,所以它的类型被提升为了int,大小就从1字节变成了4字节。有人可能要问了,sizeof( )中的表达式不是不参与运算吗?怎么会有整型提升呢?这是因为sizeof( )中的表达式虽然不参与运算,但是它得出一个计算大小的值的类型,那么,就会根据你( )中表达式,预测你的类型,从而确定提升为int 。一个表达式总是有2个属性的,一个是值属性,一个是类型属性。

char a=1;
char b=2;
sizeof(c=a+b);

c=a+b的值属性就是3,类型属性就是int。可能运算结果不会放到c里面去,但是它的类型确实是由c说了算。有运算,会发生整形提升。所以变成int

猜你喜欢

转载自blog.csdn.net/cnjdd/article/details/131340472