c语言:数据在内存中的存储

一、整形在内存中的存储

1.整形的大小为4字节,共计32比特位,首位为符号位,0为正,1为负。
2.剩余位则存储数据的补码。
原码:将数据翻译为二进制数据。
反码:原码符号位不变,其余位取反。
补码:反码 +1。
注:正数的原反补一样!
3.大端与小端。
大端:指数据低位存于高地址,数据高位存于低地址。
小端:指数据低位存于低地址,数据高位存于高地址。

举例:int a=10;
在这里插入图片描述
故我的机器为小端模式。
那怎样用代码判断机器的大小端呢?
我们创建一个int变量,初始化为1;
将其地址强转为char*并解引用;
相当于4字节中取1个低地址字节;
取出的是1则说明低位存于低地址,是小端。
取出的是0则反之。
实现:

int check_sys()
{
	int i = 1;
	return (*(char*)&i);
}
int main(int argc, char* argv[])
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端");
	}
	else{
		printf("大端");
	}
	return 0;
	}

利用联合的特性,也可将代码写为:

int check_sys()
{ 
	union
	{
		int x;
		char y;
	}un;
	un.x = 1;
	return un.y;
}

二、浮点型在内存中的存储

对于单精度浮点数
存储时分3部分:
1.S 符号位 0为正,1为负;
2.E 指数位。数据可写成1. xxx*2^E的形式;
3.M 有效数字位,即1.xxx的这部分,大于等于1小于2.
在这里插入图片描述
计算机在保存M时,因为总数大于1的,因此1被舍去,只保存小数点后面的xxx部分。
对于E ,因为指数可以为负数,但这里E是一个无符号整数,所以规定存入E时必须加上一个中间数,这里中间数为127;对于double float则是1023。

举个栗子:

float a=5.5;

a存储时,现将5.5转为二进制的科学计数法
1.011*2^2
S=0 E=2+127 M=011 00000000000000000000
最终内存存储为
0 10000001 01100000000000000000000

这里E若全为0或全为1时很特殊。
1.E全为0:
此时有效数字M不再加上1,指数为1-中间数。这样做为了表示0,以及接近0的数字!
2.E全为1:
此时,若M全为0,表示正负无穷大!

双精度浮点数存储规则一致,只不过E占11bit M占52bit 中间数为1023

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值