C语言中的整式提升和算术转换

一、整形提升

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

当两个小于int整形的的操作数在计算机中进行计算时,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整形,这种转换被称为整形提升。

我们知道,字符型的所占空间大小是1个字节即8个比特位。那么假设有两个字符型类型的操作数在进行相加或相减时。会将这两个操作数先提升为一个int的整形大小即32个比特位进行运算。计算完之后再以8个比特位对这个结果进行截断。

char a,b,c;
c=126;
b=5;
...
a=b+c;
printf("%d\n",c);

这时程序输出结果应该为什么呢?是不是131??让我们来看看输出结果:

结果是-125,并不是我们所预料的值。

分析:计算机在运算时使用的是补码进行计算,当操作数进行运算时,使用的时补码,虽然整数的原码和补码相同,但是计算出来的还是补码,而补码在打印的时候先转换成原码的形式再进行打印。因为char(1字节)小于int(4字节),所以要进行整型提升,也就是江1字节(8bit)提升到4字节(32bit)然后同位相加得到一个补码,最后将补码转换成原码以正式的形式打印出来。

那么如何进行整形提升?

整形提升是按照变量的数据类型的符号位来提升的

//负数的整形提升 char c1 = -1; 变量c1的二进制位(补码)中只有8个比特位: 1111111 因为 char 为有符号的 char 所以整形提升的时候,高位补充符号位,即为1 提升之后的结果是: 11111111111111111111111111111111 //正数的整形提升 char c2 = 1; 变量c2的二进制位(补码)中只有8个比特位: 00000001 因为 char 为有符号的 char 所以整形提升的时候,高位补充符号位,即为0 提升之后的结果是: 00000000000000000000000000000001 //无符号整形提升,高位补 0

好了知道整形提升的原则,我们再来对上面代码分析

c 126
原码:01111110
b 5
原码:00000101
相加前先整形提升
c 00000000 00000000 00000000 01111110
b 00000000 00000000 00000000 00000101
a=b+c 00000000 00000000 00000000 10000011//因为正数原反补都相同
a截断 10000011
a整形提升:11111111 11111111 11111111 10000011
a原码就是:10000000 00000000 00000000 01111101
所以就是-125

二、算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换位另一个操作数的类型,否则操作就无法进行。

下面的层次体系称为寻常算术转换:

long double
double
float
unsigned long int
long int
unsigned int
int
//转换规则:

小于int类型的先进行整形提升
排名低的向排名高的转换

例如:

分析:a/b,因为a和b都是int 类型,不需要进行提升,所以a/b的结果被认为还是int 类型,是int 类型就只会截取整数部分,所以c里面存的就是0。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值