整形提升即例题讲解(详细且简略)

整形提升是为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

1、负数的整形提升

char a=-1;
//因为变量a的二进制位(补码)中只有8个比特位:11111111
//且char是有符号的char,所以整形提升时,需要补充符号位,即为1
//提升结果是11111111111111111111111111111111

2、正数整形提升

char b=1;
//b的二进制位(补码)只有8个比特位:00000001
/因为char是有符号的char
//所以提升的时候,最高位补充符号位,即为0;
//整形提升的结果是:00000000000000000000000000000001

3、无符号整形提升(高位补0)

unsigned char c=-1;
//c的二进制位(补码)只有8个比特位:11111111
//因为c是无符号的c,所以整形提升时,高位补充0
//整形提升的结果是:00000000000000000000000011111111

整形提升的例题

1

int main()
{
	unsigned char a = 200;
	//00000000000000000000000011001000 32个比特位的a的原反补码(正数的原反补相同)
	//11001000 a的原反补码(a的类型是无符号类型,最高位1不是符号位)(char是1个字节,即8个比特位,所以从低位取8个比特位)
	unsigned char b = 100;
	//00000000000000000000000001100100(与上文一致)
	//01100100
	unsigned char c = 0;
	//a+b相加时,需要a,b先整形提升
	//00000000000000000000000011001000 a
	//00000000000000000000000001100100 b
	//00000000000000000000000100101100 a+b
	//因为c是char类型,只有8个比特位
	//0101100 c
	c = a + b;
	//0101100 c
	printf("%d %d", a+b, c);
	//c中的%d,先把c整形提升,c最前位是0,无符号位,补0
	//00000000000000000000000000101100	这个为整形提升后c的补码,最高位为0,补码原码都一样
	//00000000000000000000000000101100 c的原码,也就是打印出来的结果

	//a+b的%d,因为已经32个比特位了,不需要整形提升了,且最高位为0,补码原码一样
	//00000000000000000000000100101100 a+b的补码 (储存的)
	//00000000000000000000000100101100 a+b的原码(打印出来的)
	return 0;
}

2(short是2个字节,16个比特位)

int main()
{
	int a = -1;
	//10000000000000000000000000000001
	//11111111111111111111111111111110
	//11111111111111111111111111111111
	unsigned short b = a;
	//1111111111111111 b的原反补
	printf("%d\n", b);
	//00000000000000000111111111111111 整形提升,因为b是无符号短整型类型的,所以补0
	printf("%u\n", b);
	//00000000000000000111111111111111 整形提升,因为b是无符号短整型类型的,所以补0
	return 0;
}

(这里的%d,%u有讲究,虽然这题没有发挥出来,如有兴趣,可以前往主页搜索%d与%u的细节)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值