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

一.整数在内存中的存储

整数的2进制表示方法有三种,原码、反码和补码。

正数的原反补都相同,负数的反码是在原码除了符号位的剩余位取反,补码在反码的基础上加1。

对于整型来说,内存中存储的其实是补码。计算中使用的也是。超过一个字节的存储,就存在存储顺序的问题,接下来我们就来介绍一下大小端字节存储。

1.大端字节序和小端字节序

1.大端存储模式:数据的低位字节内容保存在内存的高地址处,高位字节内容保存在低地址处,也就是正着存。

2.小端存储模式:数据的低位字节内容保存在内存的低地址处,高位字节内容保存在高地址处,也就是倒着存。

例如 int a=0x11223344

大端存储的就是 11 22  33  44,小端存储的是 44  33  22  11.

常用的x86是小端模式,而KEIL C51为大端模式。很多ARM,DSP都为小端模式,有些ARM处理器可以由硬件来选择大小端模式。

2.设计程序判断当前机器的字节序

1在内存中存储应该是00 00 00 01,访问第一个字节空间,如果是10 00 00 00(小端),则访问的结果就是1。

//方法一
#include<stdio.h>
int check()
{
int i=1;
return (*(char*)&i)
}//只访问i的最低位字节
//方法二
int Test()
{
	union un
	{
		int i;
		char c;

	}un;
	un.i = 1;
	return un.c;
}
int main()
{
int ret=check();
if(ret==1)
printf("是小端\n");
else
printf("是大端\n");
return 0;
}

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

V =(-1)^S *M * 2^E

任意一个浮点数可以表示成以上的形式

其中(-1)^s表示符号位,当S=0,V为正数;S=1,V为负数。

1)存储M时需要注意的问题

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

因为计算机默认这个数的第一位是1,所以存储过程中可以把1舍去,只保留后面的小数部分。等到读取的时候再把1加上去。这样可以节省一位有效数字,以32为浮点数为例,留给M只有23位,相当于可以保留24位有效数字。

2)存储E时需要注意的问题

2^E表示指数位。

E是一个无符号整数,E为八位,取值范围0~255,11位0~2047。但是科学计数法中E是可以出现负数的,所以再存入内存中时E的真实值必须再加上一个中间数。对于八位的,中间数为127,对于11位的,中间数是1023。

例如十进制的5.5 转换为二进制为101.1,也就可以写成(-1)^0 * 1.011* 2^2

S=0,M=1.011,E=2.

3)   E取出的三种情况

i))E不全为0或不全为1

E的计算值减去127(或1023)得到真实值,再将有效数字M前加上第一位的1。

ii)E全为0

此时浮点数的指数E等于1-127或者1-1023,有效数字不再加上1,而是还原为0.XXXXX的小数。表示+-0,以及接近于0的很小数字。

iii)E全为1

有效数字M全为0,表示+-无穷大。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值