整形在内存中的存储之原、反、补和大小端存储介绍

变量的创建是在内存里开辟空间的,而空间的大小则是类型决定的。整形占4个字节分配4个字节的空间,那在内存中到底是怎么存的呢?

这里就来介绍一下,计算机的符号数有三种表示方法,原码,反码和补码
这三种表示方法都有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,且第一位是符号位。

原码:直接将数字按正负转换成二进制。

反码:将原码的第一位符号位不变,其它位依次按位取反就可以得到反码。

补码:反码+1就得到补码

注意:正数的原码、反码、补码都相同!
对于整形来说:数据存放内存中其实存放的就是补码

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理; 同 时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需 要额外的硬件电路。

在这里插入图片描述

因为 int占4个字节,所以分配4个字节的空间
int a = 10;
在内存中是 0a 00 00 00,
int b = -10,
在内存中则是 f6 ff ff ff
a是16进制的10没错在内存中存的是16进制的数,那为什么-10是f6 ff ff ff呢?
这里就涉及到原、反、补了,

int是4个字节,32个比特位,所以10的原、反、补

在这里插入图片描述

整形在内存中存的是二进制补码转换成的16进制,细心的人会发现在内存中16进制是倒着存的。

这里再来通过大小端来解释一下这是为什么。那什么是大小端呢

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

那么 FF FF FF F6为什么是倒着存的呢?补码从右至左依次是地位到高位,而地址则是从低到高增加。
在这里插入图片描述
介绍完大小端后再来看看一个判断大小端的代码

#include <stdio.h>

int main()
{
	int a = 1;
	char* p = (char*)&a;
	if (*p == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

	return 0;
}

在这里插入图片描述
我这肯定是小端存储模式,这是可以看到我这里是 01 00 00 00,那这个代码是怎么判断大小端的呢?
先是取出a的地址,放进了一个字符型的指针变量p里面。因为a是整形占4个字节而字符型指针只能访问1个字节,所以字符指针只会拿走拿走一个字节的内容,而且是从低到高拿,所以如果是小端就是1,大端就是0。&a前面的是强制类型转换,防止编译器警告。
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲代码的三毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值