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

被折叠的 条评论
为什么被折叠?



