C语言隐式类型转换——整型提升

文章详细解释了在C语言中,整型提升的过程,特别是对于char和short等小于int长度的类型,如何通过整型提升转换为int或unsignedint以适应CPU的ALU进行运算。在提升过程中,对于有符号数和无符号数,高位的填充方式不同,有符号数补最高位的符号,无符号数补0。以字符变量a和b的相加为例,展示了从char到int的转换和截断过程,以及最终结果的形成。
摘要由CSDN通过智能技术生成

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度

整型提升的意义:通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

因此,在c语言中,那些字节长度低于int类型的都要通过整型提升,再参加运算;

如char、short;

那么,它是怎么实现整型提升的呢?

首先,我拿char举例,我们知道char字符类型大小是1byte、8bit;

在两个字符相加时;会逐个整型提升;

	char a = 20;
	//00010100
	char b = 100;
	//01100100

正整数20的二进制源码为:00000000000000000000000000010100

但将一个4byte的int存储在一个1byte的char中,必然不能准确存放,

会截断原来8个bit的有效位存放在char中,

此时, a 中存放的就是截断后的20;也就是:00010100;

b 也一样,存储的是截断后的100;  也就是: 01100100;

	char c = a + b;

在计算a+b时;将a 和 b整型提升;将它们转为4byte32位的int,再进行二进制的相关计算

此时整型提升;要将char中的8bit提升至32bit;

怎么补呢?

在补高位时,补的是char中的符号位,

拿a变量举例

也就是将:00010100   补充至:00000000000000000000000000010100

b也亦是如此:

01100100 至  00000000000000000000000001100100

再进行 a + b

a:00000000000000000000000000010100

b:00000000000000000000000001100100

a+b:00000000000000000000000001111000

此时,char c会将它截断,至存放8bit

也就是:01111000

完成后,若想查看c的值,再加一步;

	printf("%d\n", c);

此时,还要再进行一次整型提升,因为

%d打印的是有符号的整型;

要将c中的:01111000;提升为:00000000000000000000000001111000

再打印

c中存储的值为120;

整型提升针对有/无符号整数,有不同的提升方法

有符号数:补的是存放在待提升变量中的最高位

无符号数:补0 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值