整数和浮点数在内存中存储

又是放松了一个假期接一个假期,小编我又回来了,长风破浪会有时,小编相信接下来会认认真真的对待这门的学习,不会像以前一样两天打鱼三天晒网,直挂云帆济沧海!

进入正题,这次小编学习到了又是一个特别重要的主题。

1.首先要知道数据在内存中的存储的什么形式

对与整形数据在内存中是以补码形式来存储的

说到补码,那肯定是联系到二进制,

正数的原码、反码和补码都是相等的;

而负数的反码等于原码按位取反,0变1,1变0,而补码就是反码+1,由补码得到原码也很简单,补码按位取反再+1就行了;

2.了解整形数据的存储方式后,要知道大小端字节序和字节序的判断

在超过一个字节的数据,在内存存储的时候,就会有顺序问题

举个例子 int a = 0x11223344;

大端字节序:将低字节的内容放到高地址处,将高字节内容放低地址处;  11223344

小端字节序:就是跟上面反过来;   44332211

为什么会有区分呢,大家都知道,电脑有分x64跟x86,x86对应的是小端,而x64就是大端

每种都有自己的优缺点,这里不多讲,一般现在都是x64大端的多一些。

一个字节8个比特位

那么char a = 1;  里面存储的就是int a = 1;内存的后8位:0000 0001

而char a = -1; 就是:1111 1111

来一道经典题型

int main()

{

int i = 0;

char a[1000];

for(i = 0; i < 1000; i++)

{

a[i] = -1 - i;

}

printf("%d", strlen(a));

return 0;
}

这道题的结果是255,为什么不是1000呢

上面说到char a只有8个比特位来存储内存,一旦数据内存超过8个比特位,而256正好超过,又因为char是有符号区分的,则char范围应该为-128到127。

所以这循环就是-1、-2、-3.....-127、128、127...2、1、0、-1...

但是strlen遇到\0就会停止,所以循环到0就会停止。

无符号的unsigned char的范围就是0到255了

3.接下来是浮点数在内存存储的形式

也是二进制,补码,不同的是小数点后面的

如5.5,的补码为0101.1(1.011*2^2)小数点后面对应的是2的负一、负二次方等等

浮点数内存的存储通常采用公式

浮点数V = (-1)^s * M * 2^E

S为符号位,对照5.5那个来M为1.011,E为2的次方是2

对于32位的浮点数来说,第一位为符号位,接着八位存储E(存储时省略第一位1,读取时再补。而且存储时要加入中间值127再转二进制),剩下的存储M(M总是大于等于1小于2)

64位则第一位符号位,接着十一位存储E(中间值1023),剩下M

将float a = 9.0内存形式写出

1.001*2^3

=(-1)^0 * 1.001 * 2^3

S = 0; M = 1.001; E = 3

所以为0(S)     0100 0010(E  127+3的二进制)     0010 0000 0000 0000 0000 000(M  001后面补0到23位)

因为E不恒大于0,所以要加中间值。

本次的知识分析到这里

如有错误请斧正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值