数据在内存中的存储

本文详细介绍了整数(包括原码、反码、补码)在内存中的存储方式,以及大端和小端字节序的区别。同时,讨论了浮点数的IEEE754标准,包括其32位表示形式和指数调整机制。
摘要由CSDN通过智能技术生成

一. 整数在内存中的存储

整数的2进制表示方法有三种,分别是原码,反码,补码
三种表示方法都分为符号位和数值位俩部分,符号位正数用0表示,负数用1表示,而数值位最高位被当为符号位,剩余的都是符号位

在 字符,和整数中
unsigned 一般用来表示无符号位

无符号位,最高位当数值位来用。
正整数的原,反,补都相同
而负数的三种表达方式各不相同

原码:直接将数值按照正负数的形式翻译成二进制位的得到的就是原码
反码:就是将除了符号位的,全部位依次按位取反得到就是反码
补码:反码 + 1 就是补码
对于整型来说数据中存放的就是补码

超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,
大端模式: 是指数据的低字节位存在地址的高位,高字节位存在地址低位
小端模式:和大端是相反的,低字节存低地址,高字节存高地址。

int main()
{
	int a = 0x11223344;
	return 0;
}

在这里插入图片描述
在 VS 2022中我们可以看到存储是按小端模式存储的。
我们可以写一个小程序来判断内存是按什么模式存储的

int check()
{
	int n = 1;
	return *((char*)&n);//因为 n 是4个字节 char*取地址只会读取
						//一个字节的数据,而且是从低地址开始读取
						//要是小端就会刚好读到 1 的地址
						//如果是大端则读到的数值则不是 1;
}
int main()
{
	int ret = check();
	if (ret == 1)
	{
		printf("是小端模式\n");
	}
	else
	{
		printf("是大端模式\n");
	}
	return 0;
}

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

浮点数就是 3.14,等带有小数点的数,类型主要有。float, double, long double类型
根据国际标准IEEE754,任意一个二进制浮点数V可以表示成下面的形式:
V = ( -1 )s * M * 2E
—— ( -1 )s 表示符号位,当S = 0时V为正数,当S = 1 ,V为负数
—— M 表示有效数字,M是大于1小于2的
—— 2E表示指数位
举例
十进制 5.0 转化为二进制 101.0,想当于 1.01 * 22
转化为上面的形式 S = 0, M = 1.01, E = 2.
对于32位的浮点数来说最高位 1位为字符位,接着8位为存储指数E,剩下的23位存储有效数字M
IEEE754 对有效数字M 和指数E,还有一些特别的规定
M
1 <= M < 2, M默认第一位是 1,因此是可以舍去的只保留小数点的部分, 比如 1.01 只保存 01 等读取的时候再把 1 加上上去,这样可以保存多一位的数值,23 就可以保存24位的数值
E
E为一个无符号整数
这意味着如果 E 为 8 位它的取值范围为 0 ~ 255 但是我们知道科学计数法中的 E 是有负数的,所以IEEE754 规定 存入内存时 E 的真实值必须再加上一个中间数,对于 8 位 E 来说中间数为 127 ,比如 25 时 E 为 5 存入内存时就要加上 127 ,即 127 + 5 = 1000100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值