数据在内存中的存储

文章讲述了整数(包括无符号和有符号)在内存中使用补码存储的优势,以及大小端存储的区别。同时介绍了浮点数的存储结构(如IEEE754标准),指出浮点数精度受其存储位数影响,如double比float更精确。
摘要由CSDN通过智能技术生成

整数在内存中的存储

  • 补码

正数补码-不变 负数补码-各不相同

整数在二进制中以补码的形式存储,原因在于,补码可以将符号位和数值域统一处理,加减法也可以统一处理,原码补码相互转换方法一致,不需要额外的硬件电路。

unsigned char
signed char

                                                                                                                      转换成%d的形式时需要整形提升, 用符号位填充高位

  • 大小端存储

大端存储-低位字节存储到高地址处 小端存储-高位字节存储到低地址处

判断大小端存储的程序:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
	int n = 1;
	if (*(char*)&n = 1)
//这里取n的地址之后强制转换成char*是为了获得第一个字节的地址,然后解引用就是第一个字节的内容
		printf("小端");
	else
		printf("大端");
	return 0;
}

浮点数在内存中的存储

同样是9,想以整数或浮点数的形式打印出来,结果是不一样的:


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	
	int a = 9;
	float* p = (float*)&a;
	
	printf("%d\n", a);
	//9
	printf("%f\n", *p);
	//0.000000
	*p = 9.0;
	printf("%d\n", a);
	//1091567616
	printf("%f\n", *p);
	//9.000000
	return 0;
}

原因在于他们的存储方式不同。

浮点数的存储方式:

S:符号位     M:有效数字[1,2)    E:指数位

如:5.5-->101.1-->1.011*2^2

IEEE 754规定:


对于32位的浮点数(foat),最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M

对于64位的浮点数(double),最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

E加上中间数127(8位)或者1023(11位),以确保E是正的

浮点数的存储导致有很多小数是无法精确存储的,只能尽可能精确的存储。正因为double存储的位数多,所以精度更高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值