C语言-数据在内存中的存储

目录

1.整数在内存中的存储

1.原码、反码、补码

2.大小端的存储

2.浮点数在内存中的存储

1.整数在内存中的存储

1.原码、反码、补码

计算机中的整数一般以补码的形式在内存中存储,而在显示时是以原码的形式经行表示的。

两者的转换方法在X86的环境下:

int a = -1;

10000000 00000000 00000000 00000001 //-原码
//符号位不变,其余位按位取反,变为反码
11111111 11111111 11111111 11111110 //-反码
//补码加一,变为补码
11111111 11111111 11111111 11111111 //-补码

2.大小端的存储

大端存储模式,是指数据的高字节保存在内存的低地址,而低字节保存在内存的高地址。

小端存储模式,是指数据的高字节保存在内存的高地址,而低字节保存在内存的低地址。

int a = 1;
16进制表示形式0x 00 00 00 01;

 这就是vs编译环境下的小段存储。

2.浮点数在内存中的存储

IEEE754标准提供了如何在计算机内存中, 以二进制的方式存储十进制浮点数的具体标准, 并制定了四种精度规范。这里我们研究 float类型 在计算机中是怎么存储的. 其他精度, 比如64位浮点数, 则大同小异.

想要存储一个32位浮点数, 比如8.5, 在内存或硬盘中要占用32个二进制位 (或者说32个小格子, 32个比特位)

这32个二进制位被划分为3部分, 用途各不相同:

 S:表示正负,若S为0则为整数,S为1则为负数

M:表示有效数字,大于等于1,小于2。

E:表示指数位

int float = 5.0f;
//101.0
//(-1)^0 * 1.01*2(2)
//S为0
//E为2
//M为101

IEEE 754对有效数字M和指数E,还有一些特别规定。 前面说过, 1≤M<2 。

 IEEE 754规定,默认这个数的第一位总是1,只保存后面的 xxxxxx部分。比如保存1.01的时 候,只保存01,等到读取的时候,再把第一位的1加上去。

至于指数E,情况就比较复杂。 首先,E为一个无符号整数(unsigned int) 这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们 知道,科学计数法中的E是可以出 现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数 是127;对于11位的E,这个中间 数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即 10001001。

关于E还有两个特殊情况:

若E为全零,有效数字M不再加上第一位的1,将数字看作接近于 0的很小的数字。

若E为全1,表示±无穷大(正负取决于符号位s)。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值