数据在内存中的存储

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

一 . 整数在内存中的存储

1.1整型的表现方法

整数的2进制表现方法有三种,即原码、反码和补码
有符号的整数,三种表现方法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,用1表现“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。
正整数的原、反、补码都雷同。
负整数的三种表现方法各不雷同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位稳定,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。

1.2为什么对于整形在内存中要存放补码?

在计算机体系中,数值⼀律⽤补码来表⽰和存储。
原因在于,使⽤补码,可以将符号位和数值域统⼀处理;
同时,加法和减法也可以统⼀处理(CPU只有加法器)别的,补码与原码相互转换,其运算过程是雷同的,不须要额外的硬件电路。
二 . 巨细端字节序和字节序判定

2.1什么是巨细端字节序?

在不同的编译器中,数据在内存中的存储数据会有所不同,如若将下列代码
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 0x11223344;
  5. return 0;
  6. }
复制代码

在这里可以看到将’‘11’‘位存放在了低地点处,也就是小端字节序
整型 a 存储在内存中,相信有不少人会纠结与是将"11"存放在低地点处,还是将’‘44’'存放在低地点处.由此也可以得到巨细端字节序的开端概念.
那究竟什么是大端字节序和小端字节序呢?
2.2巨细端字节序的概念

大端字节序(Big-Endian)
大端字节序,也称为大端模式,是指数据的高位字节存放在内存的低地点处,低位字节存放在内存的高地点处 。
比方,对于一个 32 位(4 字节)的整数 0x12345678,在大端字节序的存储方式下,内存中的存储顺序从低地点到高地点依次是 0x12、0x34、0x56、0x78。就好像把数据从高位到低位依次排列,高位在前,就像人们通常风俗从高位开始读写数字一样。
大端字节序常见于一些网络协议(如 TCP/IP 协议栈中规定的网络字节序就是大端字节序)和一些处理器架构(如 PowerPC 等)。
小端字节序(Little-Endian)
小端字节序,也叫小端模式,与大端字节序相反,是指数据的低位字节存放在内存的低地点处,高位字节存放在内存的高地点处。
对于上述同样的 32 位整数 0x12345678,在小端字节序的存储方式下,内存中的存储顺序从低地点到高地点依次是 0x78、0x56、0x34、0x12 。可以理解为把数据的低位字节放在前面,高位字节放在后面。
小端字节序在 x86 架构的处理器(如常见的个人计算机上的 Intel 和 AMD 处理器)中较为常见。
2.3怎样判定当前机器的巨细端字节序

以下是一个比力简易是实现方式
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int i = 1;
  5.         //0x00 00 00 01
  6.         //只需比较取出的下一为是00 还是 01 即可
  7.         if (*(char*)&i == 1)
  8.                 printf("小端 ");
  9.         else
  10.                 printf("大端");
  11.         return 0;
  12. }
复制代码
在这里将 &i 强转为char * 类型解引用后,数据和 ’ 1 ‘举行比力.如果结果为1的话,那么则证实是低地点处取出了’‘01’',则阐明是小段字节序;反之则是大端字节序.
三 . 浮点数在内存中的存储


一个浮点数必然可以以上述二进制形式表现出来;
当占据32位,也就是4个字节时:
3.1 占据32位的浮点数

IEEE 754 标准下float类型的存储布局
float类型在内存中占 32 位(4 个字节),它被划分为三个部分:
符号位(Sign bit):占 1 位,用于表现浮点数的正负,0 表现正数,1 表现负数。
指数位(Exponent bits):占 8 位,以偏移值的形式存储指数。在 IEEE 754 标准中,单精度浮点数的指数偏移值为 127。实际的指数值等于存储的指数位的值减去偏移值。
尾数位(Mantissa bits):占 23 位,存储浮点数的小数部分。规定尾数的整数部分总是 1(隐含的,不存储),所以实际存储的是尾数的小数部分

如果是占据64位的浮点数,只是符号位,指数位以及尾数位所利用的位数不同:

3.1.1有效数字M

M可以写作1.xxxxxx的形式.
IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的xxxxxx部分。比如保存1.01的时间,只保存01,比及读取的时间,再把第⼀位的1加上去。这样做的目标,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。
3.1.2 指数E

这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0 ~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。⽐如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。
E不全为0或不全为1
这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效
数字M前加上第⼀位的1。
E全为0
这时,浮点数的指数E等于1-127(大概1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很小的数字。
E全为1
这时,如果有效数字M全为0,表⽰±无穷大(正负取决于符号位s);

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表