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)

感谢您的阅读和关注! (˶╹ꇴ╹˶)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值