数据的储存


数据在内存中的储存是利用二进制进行储存的。

整数的原反补码

1.原码

  原码就是整数直接转换成二进制数,这个二进制数就是整数的原码。

2.反码

  反码是原码的每一个二进制位(除去符号位)按位取反,得出的就是这个数的反码

3.补码

  反码+1得到的就是补码

1.内存中存放的是补码
2.整型表达式计算使用的是内存中的补码
3.打印和我们看到的都是原码
4.正数的原反补码是相同的

大端字节序和小端字节序

大端字节序储存:把一个数据的高位字节序的内容放在低地址处,把一个数据的低位字节序的内容放在高地址处。
小端字节序储存:把一个数据的低位字节序的内容放在低地址出,把一个数据的高位字节序的内容放在高地址处。
eg:int a = 1; 在内存中的储存用16进制表达出来就是 0x 00 00 00 01
那么如果从左往右是低地址到高地址
小端字节序储存:01 00 00 00
大端字节序储存:00 00 00 01

浮点数储存规则

f = (-1) ^ s * M * 2 ^ E
s:符号位,用来控制有符号浮点数的符号的, s = 0为正,s = 1为负。
M:用来储存浮点数的有效数字的
E:用来储存当用二进制存放浮点数时,小数点的移动位数的。

eg:5.5f = 101.1 = 1.011 * 2^2 * (-1) ^ 0
比如上面的五点五转化成了101.1,首先第一个5转化成二进制变成了101是没有问题的,就是1 * (2 ^2)+ 0 *( 2 ^1) + 1 *(2 ^ 0) = 5。
后面的0.5是这样来的:
1 *(2^(-1))= 0.5.
浮点数在内存中是没法准确保存的,它会丢失精度。因为储存空间的大小是有限制的。

IEEE 754规定:
对于32位的浮点数:最高的一位是符号s,接着的八位是指数E,最后的23位是有效数字。

对于64位的浮点数:最高的一位是符号s,接着的11位是指数E,最后的52位是有效数字。

特殊规则: 由于M的第一位一般都是1,所以在储存的时候将这个1省略了,这样可以多处一个比特位去来储存剩下的信息,提高精度。读取时,会再把第一位的1加上去。

指数E的特殊规则
首先,E作为一个无符号数,当E取八位时,它的范围是0~255,当它取11位时,它的范围是0-2047,但是,如果这个浮点数是小于1的,那么E是会出现负数的。

所以 IEEE 754 规定:存入内存时,这个E的真实值必须再加上一个中间数,当E是8位时,中间数为127,当E是11位时,中间数是1023。

eg:2^10 的E是10,所以保存成32位浮点数时,必须保存 10+127 = 137
即:10001001

E为全0,无限小。
E为全1,无限大。

作业错误


使用printf函数的时候无论你向这个函数中传进去的 是什么,printf只会根据类型的不同将用两种不同的长度存储。其中8字节的只有long long、float和double(注意float会处理成double再传入),其他类型都是4字节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值