一.整型家族
①.char (字符的本质是ASCII码值 ASCII表, 是整型)
unsigned char(是否默认, 取决于编译器)
signed char(是否默认,取决于编译器)
②.short
unsigned short
signed short(默认)
③.int
unsigned int
signed int(默认)
④.long
unsigned long
signed long(默认)
二.整型在内存中的存储
整数在内存中存放的是补码的二进制序列
①.原码,反码, 补码
二进制有三种表示形式,也就是原码, 反码, 补码
*存储在内存中的有符号整数通常以补码形式表示*
**补码的优点是**可以统一处理加法、减法和乘法运算,
而不需要额外的处理逻辑。此外,补码的范围比原码和反码更大
注 : 在计算时,补码只进行加法 : 减法变成了正数加负数
特殊: 无符号整数的原反补是相等的
计算规则
:原码除了符号位的其他位全部按位取反得到反码
:反码加一得到补码
②.正整数的储存
无符号整数直接以二进制储存,原反补码相同,无需转换
③.负整数的储存
有符号整型的二进制最高位为符号位
已知signed int类型大小为4个字节, 32个比特位,最高位为符号位,但是所有位都为有效
例1: int i = -8
原码 : 10000000 00000000 0000000 00001000
反码 : 111111111 111111111 11111111 11110111
补码 : 111111111 111111111 11111111 11111000
④.字符的存储
1.有符号字符
一个有符号的char的取值范围: -128~127
signed char = 1bit = 8byte = 也就是8个二进制位
8个二进制位能表示的范围,就是一个有符号字符的取值范围
推理过程 :
正数: 最小原码:00000000 --- 0
最大原码: 01111111 --- 127
负数 : 最小原码:10000000(补码:10000000) --- -128
2.无符号字符
最大11111111
= 1 * 2^0 + 1 * 2^1 + 1 * 2^2 + 1 * 2^3 + 1 * 2^4 + 1 * 2^5 + 1 * 2^6 + 1 * 2^7
= 255
三.整型之间的转换
①.整形提升
概念 :
整型提升是指在表达式中使用不同大小的整型数据类型时,编译器自动将较小的整型数据类型转换为较大的整型数据类型的过程
原因:
long double
double
float
unsigned long int
long int
unsigned int
int
char 在以上列表中属于最低位置,char类型会被转换为更大的数据类型
(如int)来进行计算.
**上面的强于下面的(四则运算是下面的会转化成下面的**
也称为隐形式转换 - 在四则运算法和使用赋值操作符会发生
例:
int main()
{
unsigned char a = -1;//只能存8个比特位, 一个字节 原本32个比特位的整型需要被[截断]
//10000000 00000000 00000000 00000001 负一的原码
//11111111 11111111 11111111 11111110 负一的反码
//11111111 11111111 11111111 11111111 负一的补码
//在内存中截断
// 11111111 uc a的补码
//以%d打印时提升 : 规则,无符号补0
//00000000 00000000 00000000 00000001 提升后的原码
//无符号类型提升为有符号整型时,会将其原始值复制到更宽的有符号整型中,并保持原码不变
//随后无符号类型,在提升操作时会执行零扩展
//注意!注意!注意! ---- 无符号字符是没有原反补的概念的
signed char b = -1;
char c = -1;//这里默认有符号
//10000000 00000000 00000000 00000001 原码
//11111111 11111111 11111111 11111110 反码
//11111111 11111111 11111111 11111111 补码
// 11111111 截断后的 补码
//提升在高位补符号位
//11111111 11111111 11111111 11111111 提升后的 补码 -- 对应b,c = -1
printf("a=%d b=%d c=%d ", a, b, c);//%d意味着有符号位整型
//char需要提升补码 -> 按符号位从高位补齐32个比特位(无符号位直接高位补0)
return 0;
}
1.无符号类型的提升
对于无符号类型,其值的范围是从0到最大值。当将无符号类型提升为更宽的有符号整型(如int)时,它的原始值会被复制到新的类型中,并保持原码不变。
2.有符号类型的提升
2.1.原始值转换:
取出unsigned char变量a的二进制表示中的所有位(8位),并将其视为无符号数值。
2.2.符号位检查:
检查unsigned char的最高位,即二进制表示中的最左侧位(第8位),如果该位为 1,则说明原始值是负数,如果该位为0,则说明原始值是非负数。
2.3.扩展位填充:
假设将unsigned char的8位值扩展为int类型的32位值,需要填充24个额外的位。根据符号位的值进行填充:
2.3.1扩充规则
如果原始值是负数(符号位为1),则在扩展过程中填充的24个位都被设为1,以保持负数的状态。
如果原始值是非负数(符号位为0),则在扩展过程中填充的24个位都被设为0,以保持非负数的状态。
四.整型类型的打印
-
带符号十进制整数:%d
用于打印带正负号的十进制整数。 -
无符号十进制整数:%u
用于打印不带正负号的十进制整数。 -
八进制整数:%o
用于打印八进制形式的整数。 -
十六进制整数:%x 或 %X
-
%x 用于打印小写字母表示的十六进制数。
-
%X 用于打印大写字母表示的十六进制数。
-
用字符表示整数:%c
用于打印一个字符,其ASCII码对应整数值。