隐式类型转换—整型提升

整形提升是什么?

由于C语言中整形算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符型和短整型操作数在使用之前会被转换为普通整形int,再展开计算,这种转换称之为整形提升。

如何进行整型提升?

整形提升分为两种情况分别是:有符号的整形提升无符号的整形提升。整形提升是根据变量补码被截断时的最高位来确定进行补位的数,即整形提升是按照变量的数据类型的符号位来提升的。

对于有符号位的数,当补码最高位为0或者1时,将使用相对应的数进行补位,将补码序列补充至完整的32位(int型长度为4字节 ,即32位)。

对于无符号位的数,其无符号位,只需要在被截断后的补码序列前面补充0至完整的32位即可。

注意:有符号或无符号只是针对整数而言,其中有符号的数表示为signed+类型,无符号的数表示为signed +类型。例如:

signed int、unsigned int、signed short、unsigned short、signed long、unsigned long等等,这些表示整形的类型我们称之为整形家族,正常情况下整形家族不加signed默认表示为有符号的类型,而表示无符号的需要加上unsigned。

特别的,其中char类型也存在有符号与无符号,由于char类型本质上是由ASCLL 所对应的数字大小来存储的,所以也分为有符号和无符号的数,但与整形家族相比,C语言中没有明确规定单独的char是表示有符号还是无符号的数,在不同编译器下会有不同的情况,所以在使用char类型来存储整数的时候最好要指明是否为有符号或者为无符号的数。

整型数中发生的截断

为了更好的了解整形提升,我们有必要知道关于截断的一些知识,截断一种发生在将多字节数据类型赋值存储在较少字节数据类型。对于整型数据中发生的截断,就是将整型数据赋值存储于比整型长度小的类型当中。例如,将一个4个字节长度的int类型数据赋值存储在一个字节大小的char类型中,就将会发生截断。计算机在存储整型数据是存储整数的补码二进制序列,所以发生截断的对象也就为补码。

例如:

正常情况存储在为int型的数字128 补码:00000000 00000000 00000000 10000000,将其赋值给char型的n后,n的补码序列被截断为就变为8位的 :10000000

此时n的最高位变为了1,变成了负数,再进行使用数据进行运算就会产生意想不到的结果。

整形提升的发生

整型提升的发生是一种隐式类型转换,是计算机处理数据的一个行为。对于比int类型长度小的数据类型,在计算时都先要进行整型提升为int类型数据,然后再进行运算。

例如:

 看完程序的运行结果是否有些出乎意料呢,这正是整形提升与截断产生的结果。那么让我们来详细解析一下这道题吧。

为什么a的值打印出来是-128:我们知道要128是一个整数,拥有4个字节大小,其补码序列为32位的:00000000 00000000 00000000 10000000,而a为一个字节类型的char,在将128赋值存储的过程中会发生截断,将其剩余的一个字节的补码序列:10000000存储到a中,当再次使用a以整形打印出来的时候又会发生整形提升,a为有符号的类型,在发生整形提升时,补对应的符号位,也就是最高位的1,补满后的补码序列为:11111111 11111111 11111111 10000000,此时我们需要得到原码,也就是此时数的大小,我们先将补码-1得到反码:11111111 11111111 11111111 01111111  ,再将反码除符号位进行按位取反得到原码:10000000 00000000  00000000 10000000,此时我们读出结果:-128。

为什么b的值打印出来是-1:同样的,要将4个字节的整形数-1存储到为一个字节的char类型中,也会发生截断,发生截断后b中的补码序列为:11111111,再使用b打印结果 发生整形提升,而由于b为无符号的类型,在发生整形提升时,只需要将剩余序列用0补齐至32位,即可到原码(b为无符号的数):00000000 00000000 00000000 11111111,读出结果:255

为什么c的值打印出来是127:由上面来两个a以及b的打印值的分析,我们就能够很容易知道c的打印结果,在上面的分析,我们知道了a在整型提升后的值为:-128,而b整型提升后的值为-1,再将a+b的和赋值给c时,只需要直接相加即可得到c的值:127,这是因为存储c的类型为4个字节的整型,与a和b整形提升后的类型相同。


结语:

本期操作符的相关知识到这就介绍完了,如果感觉对你有帮助的话还请点个赞支持一下!有不对或者需要改正的地方还请指正,感谢各位的观看。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值