一、知识回顾
1.数据类型
char -字符型 //在内存中占一个字节
short -短整型 //在内存中占两个字节
int -整型 //在内存中占四个字节
long -长整型 //在内存中占四个字节
float -单精度浮点型 //在内存中占 四个字节
double -双精度浮点型 //在内存中占八个字节
int* p -指针类型 //在32位操作系统占用4个字节,64位系统占用8字节
其他:
数组类型: int arr[10] //所占内存大小等于数组大小*类型
结构体类型 struct : 所占内存大小等于所有成员变量所占空间大小,但考虑对齐方式时,结构体变量不是所有成员变量所占空间大小之和,牵涉到整型提升。
枚举类型 enum : 有符号,根据其类型分配内存大小
联合类型 union: 所占存储空间大小取决于联合体中最大数据类型所占的空间的大小。
二、数据在内存中储存形式
1.原码、反码、补码的概念
- 原码:数据转换成二进制的形式,最高位为符号位
- 反码:原码符号位不变,其他位按位取反
- 补码:反码+1
注意:
(1)正数,原、反、补都相同
(2)补码符号位不变,其他位按位取反,然后+1得到原码
(3)计算机系统中,所有的数值都是以补码的形式存储的
2.大端和小端模式介绍
- 大端模式:指数据低位保存在内存的高地址中,数据的高位保存在低地址中
- 小端模式:指数据低位保存在内存低地址中,数据高位保存在内存高位中
举个例子:
int a =(数据高位)0x11223344(数据低位);
假设内存中从左到右地址由低到高:
那么变量a在内存中的储存形式为:
- 大端:(地址低位)11223344(地址高位)
- 小端:(地址低位)44223311(地址高位)
三、整型提升
1.整型提升的概念:
C语言中,算术运算总是把表达式中字符类型(char)和短整型(short)操作数转换成普通整型(int),这种转换称为整型提升。
举个例子:
char a=1;char b=2;char c; c = b+a;
这时a在内存的形式为00000001,b为00000010
- 运算前,b和c的值在内存中存储形式都要转换成int类型,即32位bit。
- a运算前在内存中整型提升为:
0000 0000 0000 0000 0000 0000 0000 0001- b运算前在内存中整型提升为:
0000 0000 0000 0000 0000 0000 0000 0010- 然后a和b进行相加得:
0000 0000 0000 0000 0000 0000 0000 0011
因为c为char类型,只占一个字节即8个bit位所以- c为:0000 0011 即等于3
而上面的例子, a 和 b都为有符号数的正整数
当char a =-1时,整型提升的方式不相同:
举个例子:
char a = -1;char b=2;char c; c= a+b;
- a的二进制(补码形式存储在内存中)为:
1111 1111- 运算前整型提升为:
11111111 11111111 11111111 111111111- a + b进行运行后的结果:
0000 0000 0000 0000 0000 0000 0000 0001- c为char类型,只接收8个bit 位,其他为丢弃,c为0000 0001
- c的值为1
总结:
- 整型提升的意义:表达式的整型运算要在CPU的相应运算器中执行,CPU内整型运算器的操作数字节长度一般为int类型的字节长度,同时也是CPU的通用寄存器的长度,因此,两个char类型相加,在CPU中执行的实际是先把char类型整型提升为int类型的标准长度。
- 整型提升的方法:
(1)整型提升是按照变量的数据类型的符号位来提升的,即,负数的高位补1,正数高位补0
(2)对于无符号数来说,高位一律补0
四、最后
关注我,接下来详细解析数据内存经典例题,保你学会!😃