整形提升的理解

什么是整形提升?

在K&R和C89的早期实现中,基于short和char的算术运算陷入两难的困境,因为可能会产生两种不同的结果。因此,在C99中很明确地定义了整型提升的规则. 如果int能够表示原始类型中的所有数值,那么这个数值就被转成int型,否则,它被转成unsigned int型。这种规则被称为整型提升,可能看着这个概念还有点模糊,那么请看一下我下面的代码。

#include<stdio.h>
int main()
{
	char a = 3;
	//a的补码00000011
	char b = 127;
	//b的补码01111111
	char c = a + b;
	//所以a+b得到10000010,即c的结果就是如此
	//对c进行整形提升得到(因为c的符号位是1则高位补1)得到\
	11111111111111111111111110000010即为一个负数,对负数进行转换需得到的补码减一得到\
	11111111111111111111111110000001得到反码,将反码转化为原码得到\
	10000000000000000000000001111110即为-(2+4+8+16+32+64) = -126
	printf("%d\n", c);//检验结果
	//发现a,b均为char类型,没有达到一个int的大小
	// 则会发生整形提升
	char e = 2;
	//e 的 补码为00000010
	char d = 1;
	//d 的 补码为00000001
	char f = e + d;
	//相加的结果为00000011(因为f的符号位为0则高位补0)得到\
	00000000000000000000000000000011即为1+2)= 3
	printf("%d\n", f);
	return 0;
}

那么这个时候可能会有朋友问了,如何去判断原反补码对应的长度呢?那么我们就可以去使用sizeof去求对应char(int,float)等的长度,求出来的结果乘与8即可,想了解更多的知识,可以查看《计算机组成原理》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值