c 内存储存形式 数据
- 行业动态
- 2025-02-15
- 3459
整数在内存中的存储
整数在内存中通常以二进制补码的形式存储,以32位系统为例,一个整型变量占用4个字节,即32位,对于有符号整数,最高位为符号位,0表示正数,1表示负数;对于无符号整数,所有位都用于表示数值本身。
整数5的二进制原码、反码和补码均为00000000 00000000 00000000 00000101;而-5的二进制原码为11111111 11111111 11111111 1011,反码为11111111 11111111 11111111 1010,补码为11111111 11111111 11111111 1011。
浮点数在内存中的存储
浮点数在内存中一般遵循IEEE754标准的32位或64位浮点数表示法,以单精度浮点数(32位)为例,其存储格式如下:
符号位:占1位,位于最高位,用来表示数的正负,0表示正数,1表示负数。
阶码:占8位,用于表示指数部分,阶码采用偏移码表示,单精度浮点数的阶码偏移量为127,实际指数为3时,存储的阶码为3 + 127 = 130,即二进制的10000010。
尾数:占23位,用于表示有效数字的位数,尾数通常是一个大于等于1且小于2的二进制小数,在存储时省略了小数点前面的1,只存储小数点后面的部分。
对于浮点数3.14,其二进制近似值为11.00100011110101101010100011,按照IEEE754标准存储为:符号位0,阶码10000010,尾数0010001111010110101010100011。
字符型数据在内存中的存储
字符型数据在内存中以ASCII码的形式存储,ASCII码是一种基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,它最初被设计用于电报交换,后来被广泛应用于计算机系统。
每个字符被分配一个唯一的数字编码,例如字母’A’的ASCII码是65,对应的二进制为01000001;字母’a’的ASCII码是97,对应的二进制为01100001。
数组在内存中的存储
数组在内存中是连续存储的,即数组元素在内存中的地址是连续的,定义一个整型数组int arr[5]
,假设数组的首地址为p
,那么数组元素的内存地址分布如下:
元素 | 地址 | |
arr[0] | p | 第一个整型元素 |
arr[1] | p+4 | 第二个整型元素 |
arr[2] | p+8 | 第三个整型元素 |
arr[3] | p+12 | 第四个整型元素 |
arr[4] | p+16 | 第五个整型元素 |
这里,每个整型元素占用4个字节,所以相邻元素的地址相差4个字节。
指针在内存中的存储
指针在内存中存储的是其所指向对象的内存地址,在32位系统中,指针占用4个字节;在64位系统中,指针占用8个字节,定义一个整型变量int a = 5
和一个指向该整型变量的指针int *p = &a
,如果变量a
的内存地址为0x0012FF7C
,那么指针变量p
中存储的就是0x0012FF7C
这个地址值。
结构体在内存中的存储
结构体在内存中是按照定义顺序依次存储各个成员变量的,为了提高内存访问效率,编译器会对结构体成员进行对齐处理,对齐规则通常是按照结构体中最大成员变量的对齐要求来进行对齐。
定义一个结构体struct S { char c; double d; int i; };
,假设char
类型占1个字节,double
类型占8个字节,int
类型占4个字节,由于double
类型的对齐要求最高,通常会以8个字节对齐,所以该结构体在内存中的存储可能是这样的:
成员变量 | 偏移量 | 占用字节数 | 内存地址示例 |
c | 0 | 1 | 0x0012FF70 |
填充字节 | 1 | 7 | 无实际意义,用于对齐 |
d | 8 | 8 | 0x0012FF78 |
i | 16 | 4 | 0x0012FF80 |
这里,为了让double
类型的成员变量d
的地址能够被8整除,在char
类型成员变量c
后面添加了7个填充字节。
FAQs
Q:为什么不同的数据类型在内存中占用的字节数不同?
A:不同的数据类型占用的字节数不同,主要是因为它们表示的数据范围和精度不同,整型数据需要表示较大范围的整数,所以通常占用4个字节;而字符型数据只需要表示单个字符,所以占用1个字节。
Q:如何判断当前机器是大端字节序还是小端字节序?
A:可以通过编写一个简单的程序来判断,定义一个短整型变量short x = 0x0102;
,然后将其地址转换为字符指针char *p = (char *)&x;
,通过比较*p
和*(p+1)
的值来判断,如果*p
的值为0x01,则说明低字节存储在低地址处,是小端字节序;如果*p
的值为0x02,则说明低字节存储在高地址处,是大端字节序。