C语言:数据在内存中的存储方式
1.内存的组成
内存通常被分为5个区域:
1.栈区:存储局部变量、函数形参
2.堆区:存储动态分配的内存(malloc、calloc、relloc开辟的空间)
3.静态区:存储全局变量、静态变量(static修饰的变量)
4.只读数据段:存储字符串常量(“hello world”)、整形常量(1234)等
5.代码段:存储程序可执行的代码
2.内存单元
内存中的最小存储单位是bit,最小寻址单位是字节
1字节=8bit
3.地址
- 内存是空间,地址是空间的门牌号。
- 数据和地址本身内存中以二进制的方式存储,但为了方便人们阅读和处理,其一般以十六进制的形式出现。
左边为地址,右边为数据
4.大小端字节序存储
大小端(Endianness)是计算机系统中用于描述数据在内存中存储顺序的术语。它主要有两种方式:大端(Big Endian)和小端(Little Endian)。
- 在大端模式下,数据的高位字节(最重要的部分)存储在低地址端,而低位字节存储在高地址端。
例如整数 0x12345678 在内存中的存储顺序为(低地址)12 34 56 78(高地址)
- 在小端模式下,数据的低位字节(最低重要的部分)存储在低地址端,而高位字节存储在高地址端。
例如整数 0x12345678 在内存中的存储顺序为(低地址)78 56 34 12(高地址)
5.整形在内存中的存储方式
1.原码、反码、补码
原码、反码和补码是计算机中用于表示有符号整数的三种不同的编码方式。
-
原码:原码是最直观的表示方法。最高位用作符号位,0表示正数,1表示负数。其余位表示数值的绝对值。
-
反码:正数的反码与原码相同。 负数的反码是在其原码的基础上,符号位不变,其余各位取反。
-
补码:正数的补码与原码相同。 负数的补码是在其反码的基础上,末位加1。
2.内存中储存的数据的补码
int a=3;//原码反码补码都为00000000 00000000 00000000 00000011
//小端模式下a在内存中的存储结果为:(低地址)00000011 00000000 00000000 00000000(高地址)
int b=-3;//原码10000000 00000000 00000000 00000011
//反码11111111 11111111 11111111 11111100
//补码11111111 11111111 11111111 11111101
//小端模式下b在内存中的存储结果为:(低地址)11111101 11111111 11111111 11111111(高地址)
6.浮点型在内存中的存储方式
- 浮点数在内存中的存储方式遵循 IEEE 754 标准。
任意一个二进制浮点数可以表示成下面的形式:
(-1)S * M * 2E
(-1)S表示符号位,S=0表示正数,S=1表示负数
M表示有效数字,1<=M<2
E为指数位,表示底数为2的指数
例如:5.5先转换成二进制浮点数101.1(小数点后第N位的权重位2(-N))
S=0 , M=1.011 , E=2
101.1表示为(-1)0 * 1.011 * 22
- 浮点型在内存中只需存储S、M、E
1.在标准中E的数据类型为unsigned int,无法存储E为负数的浮点型(如:(-1)0 * 1.01 * 2(-2)),所以标准规定单精度浮点型指数位存储E+127,双精度浮点型存储E+1023
如:当E=-5,存储122的二进制形式,当E=5时存储132的二进制形式
2. 由于1<=M<2,标准中规定只存储M小数点后的部分
如:当M=1.011时,将011存储在内存中,小数点前的1则被舍弃
float a=5.5;//S=0,M=1.011,E=2
a在内存中的存储结果为:0 10000001 01100000000000000000000
按字节分割则为:01000000 10110000 00000000 00000000
- 当E的值为全0或全1时,表示几种特殊情形:
指数 尾数 描述
全0 全0 正零或负零
全0 非全0 非规格化数
全1 全0 正无穷大或负无穷大
全1 非全0 NaN (Not a Number)
感谢您的阅读和关注! (˶╹ꇴ╹˶)