C语言整型提升

C语言在进行整型运算时,会将字符和短整型提升为int型进行计算,确保运算精度。整型提升包括正数、负数的提升,以及涉及两个char型相加的情况。在提升过程中,会考虑数据的补码表示,对于正数和负数,高位会补充符号位。例如,两个char型相加时,会先进行整型提升再进行加法运算。

1. 概念

C语言的整型算术运算总是至少以缺省(可理解为默认)整型类型的精度进行计算。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前(在进行算术运算之前)被转换为普通整型(int型),这种转换成为整型提升

2. 意义

表达式的整型运算在CPU相应运算器件内执行,CPU内整型运算器的操作数的字节长度一般就是int的字节长度,在CPU执行时实际上要先转换为CPU整型操作数的标准长度。

举例来说:即使两个char型数据的相加,在CPU执行时实际上也要先转化为CPU内整型操作数的标准长度。

所以,当表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后再送去CPU中执行运算。

3. 数据以补码的形式存储

整数的二进制表示形式有三种:
原码、反码、补码
原码:直接通过正负形式写出的二进制序列;
反码:原码符号位(最高位表示符号位,正数为0,负数为1)不变,其他位按位取反;
补码:反码+1

正整数的原、反、补码相同(下面以5为例)
负整数的原、反、补码需要计算

int a = 5为例
原码:00000000 00000000 00000000 00000101
反码:00000000 00000000 00000000 00000101
补码:00000000 00000000 00000000 00000101
内存中存储形式是0x00 00 00 05

int b = -10为例
原码:10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
补码:11111111 11111111 11111111 11110110
内存中存储形式是0xff ff ff f6

4. 如何整型提升

(1) 正数的整型提升

char c1 = 1;为例
00000000 00000000 00000000 00000001 (int型)
但如果c1以char类型存储,只有8个bit,需要截断
00000001(实际内存中的c1)

整型提升(存储的是00000001,有符号char型,默认最高的0是符号位,高位补符号位)
00000000 00000000 00000000 00000001

(2) 负数的整型提升

char c2 = -1; 为例
10000000 00000000 00000000 00000001 - 原码
11111111 11111111 11111111 11111110 - 反码
11111111 11111111 11111111 11111111 - 补码
11111111(实际内存中的c2)

整型提升(存储的是11111111,有符号char型,默认最高的1是符号位,高位补符号位)
11111111 11111111 11111111 11111111

(3)两个char型相加

示例:

char a = 5;
char b = 126;
char c = a + b;
printf("%d\n", c);
//打印:-125

00000000 00000000 00000000 00000101
00000101 – a
00000000 00000000 00000000 01111110
01111110 - b

先整型提升,再相加
00000000 00000000 00000000 00000101 - a
00000000 00000000 00000000 01111110 - b
00000000 00000000 00000000 10000011 - c
10000011 - c(实际内存中的c)

以有符号整型形式打印c,需整型提升
11111111 11111111 11111111 10000011 - 补码
11111111 11111111 11111111 10000010 - 反码
10000000 00000000 00000000 01111101 - 原码(-125)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值