整型提升的原因,发生条件以及经典例子

一:什么是整型提升

二:如何进行整型提升

三:整型提升例子

一:什么是整型提升

C语言的整型算术运算总是至少以缺省整型类型(计算机整型默认的类型-int)的精度来进行的,为了获得这个精度,表达式中的字符和短整形操作数在使用前都会被转换为默认的普通整型,这种转换称为整型提升。意义也就是更好的配合了CPU计算,这就是我读完书本上对整型提升意义的感受。

二:如何进行整形提升

我们举个有符号的char类型来看,

(1)负数的整型提升

char C1 = -1;
	//此时C1的二进制位为11111111(八个比特位)

整型提升高位补符号位1:

结果为11111111111111111111111111111111(32位1)

(2)正数的整型提升

char C2 = 1;
	//此时C1的二进制位为11111111(八个比特位)

整型提升时高位补充符号位零:

结果为00000000000000000000000000000001

若char为无符号的,高位补零。

三:整型提升的例子

 (1)sizeof内部表达式涉及的整型提升,程序是先编译的,再进行代码运行,而sizeof是在编译阶段就得出结果,都不会计算内部表达式,这都没有整型算术运算,又怎么整型提升呢?又怎么能说整型提升使得sizeof(+a)的结果变为4呢?别急,且听我娓娓道来。

 

 sizeof确实是在编译阶段根据表达式得出的结果类型而计算大小,真正发生整型提升也是在代码运行的时候,但它的步骤不是去计算这个表达式,然后等表达式得出结果后判断结果的类型,再用sizeof类型长度正确的步骤是sizeof根据规则判断表达式的类型属性,然后再用sizeof计算类型大小因为一个表达式结果类型都是规则固定好的, 例如s=a+3,sizeof无需计算这个表达式也能知道结果就是s的类型,这就是规则,如果表达式里面有算术运算如+C2,C2==1,表达式结果C2都会整型提升,提升的类型也是固定的int,这说明整型提升是会影响表达式结果类型的,那当sizeof判断表达式结果类型也就得考虑表达式结果会不会整型提升。
所以即便没有真正运算括号里面的式子,sizeof也能凭借规则知道表达式的类型属性,sizeof看到有(+C2),就知道括号里面是算术运算,会导致整形提升,就知道表达式结果的类型是int所以说整型提升这一规则使得sizeof(+a)的结果变为4是正确的。

还有值得一提的是sizeof(++a)的结果为什么为1,首先++a应该理解为a=a+1,这说明最后的类型是看a的,所以结果还是1,我当时发现sizeof(++a)中的++a也是算术运算,不是说char或者short参与算术运算就会涉及整形提升吗?为什么++a没有被sizeof判断a有整形提升,从而判断结果类型为int,直到被别人提醒++a是和a=a+1等价的,我才焕然大悟。

(2)还有一种情况发生会发生整型提升就是当我们用printf的时候

char a=0;
printf("%d",a);

此时C1为char,char一般为signed,即是有符号的,此时用printf以%dd的格式打印它,编译器就使C1整型提升,C1为有符号, 为char的负数的整型提升,结果为(11111111111111111111111111111111),%d的输出格式认为这个结果为-1的补码,结果还是-1,但是用%u打印时,这C1的整型提升结果则会是一个非常大的数。

好啦,以上就是我对于整型提升的所有想法,如果大家有问题可以私信我,我每天都会查看的!

  • 33
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小何只露尖尖角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值