深入理解隐式类型转换——“整型提升” 看完不会评论区打我

什么是整型提升???😇😇

C语言的整型算术运算总是至少以缺省整型类型的精度来进行的
为以这个精度计算,表达式中的字符类型(char)和短整型(short)操作数在使用之前要被转换为普通的整型,这种转换称为整型提升

为什么有整型提升???

因为表达式的整型运算要在CPU的相关运算器件内执行,CPU内的整型运算器(ALU)的操作数的字节长度一般情况下跟int类型的字节长度一样,同时也是CPU的通用寄存器的长度.

所以,如果是两个char(short)类型的数相加,在CPU内部执行时要先将其转换为CPU内整型操作数的标准长度.

因为,通用的CPU是难以直接实现两个1.2字节的数直接相加(机器指令可能可以).所以表达式里面运算里,各种长度小于int长度的整型值,都必须先提升为int或usigned int类型,然后才能送入CPU内进行运算.

如何进行整型提升! ! !

首先我们要了解数据在内存里的存储方式

以int类型的整数13和-13举例:

  1. 正数:原码=反码=补码 而负数为下面情况

  2. 原码:数值本身的大小(下面的逗号只是为了方便看,因为一个字节==8个比特位,第一个是符号位,正为0负为1,)
    0,0000000,00000000,00000000,00001101— 13
    1,0000000,00000000,00000000,00001101— -13

  3. 反码:就是符号位不变对原码所有位取反(反码只是一个"原码"转"补码"的中间状态,没有什么作用)
    0,0000000,00000000,00000000,00001101— 13
    1,1111111,11111111,11111111,11110010— -13

  4. 补码:等于反码加1(内存里实际存储的都是数据的补码而非补码)
    0,0000000,00000000,00000000,00001101— 13
    1,1111111,11111111,11111111,11110011— -13

正数的整型提升:
char a = 1;
变量a类型为char所以只有1个字节也就是8个二进制比特位(补码存储):
00000000,00000000,00000000,00000001— 1
00000001— a
实际上1是整型由32个二进制比特位组成(4个字节),但是存放在char类型里面(1个字节)放不下,所以只能截断.
char是有符号类型的char
所以如果发生整型提升时,高位全部补充符号位,也就是0
00000000,00000000,00000000,00000001

负数的整型提升
char b = -1;
变量b类型是char所以只有1个字节也就是8个二进制比特位(补码存储):
11111111,11111111,11111111,11111111— -1(补码)
11111111— b
实际上-1是整型由32个二进制比特位组成(4个字节),但是存放在char类型里面(1个字节)放不下,所以只能截断.
char是有符号类型的char
所以如果发生整型提升时,高位全部补充符号位,也就是1
11111111,11111111,11111111,11111111

无符号数的整型提升,高位全补充0

  • 且看下面例子:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第一个是sizeof(a)这里面是直接求a在内存里所占字节数(不是一个表达式所以不用整型提升)而下面两个就不同了
这里我们打印用的是%d,而sizeof()里面是+a和-a(有了操作符所以其是一个表达式),而a是char类型不够int类型的字节数,所以需要整型提升,提升后就所占int类型的大小

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侠客cheems

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值