ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

整形在内存中的存储、计算机大、小端存储模式

2020-12-22 13:02:43  阅读:246  来源: 互联网

标签:小端 存储 反码 00000000 补码 内存 原码


整形在内存中的存储

整形在内存中的存储

创建一个变量是需要在内存中开辟空间的。空间的大小是根据不同类型决定的。

那么,整形数据在内存中是如何存储的呢?

例如:一个 int 型的变量,所占4个字节空间,那么数据在空间里如何存储呢?

原码、反码、补码

计算机中的有符号数,有三种表示方法,即:原码、反码、补码
这三种表示方法都有 符号位数值位
符号位:用 0 表示 ”正” ,用 1 表示 “负” 。

原码

直接将二进制按照正负数的形式翻译成为二进制就可以。

反码

将原码的符号位不变,其他位按位取反就可以得到反码。

补码

反码 + 1 就可以得到补码。

注意

对于正数的原码、反码、补码都相同。
对于整形来说,数据存放在计算机的内存中,其实存放的都是补码。
因为,CPU只有加法器。

例如:

在调试窗口打开内存查看:

调试的相关知识,见下面链接:
调试的重要性

#include <stdio.h>

//在计算机中整形在内存的存储
//原码、反码、补码
int main()
{
	int a = 30;
	//a的原码、反码、补码均为:00000000 00000000 00000000 00011110
	int b = -20;
	//b的原码:10000000 00000000 00000000 00010100
	//b的反码:11111111 11111111 11111111 11101011
	//b的补码:11111111 11111111 11111111 11101100

	int c = a + b;
	//a+b:
	//00000000 00000000 00000000 00011110
	//11111111 11111111 11111111 11101100
   //+
	//00000000 00000000 00000000 00001010 ->10
	return 0;
}

a的补码二进制转换为16进制为:0x0000001e
b的补码二进制转换为16进制为:0xf f f f f fec
c的补码二进制转换为16进制为:0x0000000a
在这里插入图片描述
如上图,我们可以发现,整形数据在内存中是按照补码的方式存储的。
另外 我们还发现数据在内存中,不是按照我们习惯的方式存储,而是“倒着”,如下图:
这种方式称为:小端存储
在这里插入图片描述

大、小端存储模式

什么是大端、小端

大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在低地址中
例如:a -> 0x0000001e 在大端模式中: 00 00 00 1e
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,保存在高地址中;
例如:a -> 0x0000001e 在小端模式中:1e 00 00 00

我们平常接触到机器为:小端机。

编写程序,判断当前的机器为大端机还是小端机:

方法1:

在int型给char型的时候,发生了截断,将首元素给了ch,如果最后一位是0,则是大端机;否则是小端机。

//截断
#include <stdio.h>
 
int main()
{
	int val = 1;
	char ch = val;//发生了截断,将最后一个字节给了ch
	if (ch)//如果是0,就是大端机
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
}

在这里插入图片描述

方法2:

强转:
在这里将i的地址的首元素强转为char* ,然后解引用找到,判断是否为1

//强转
#include <stdio.h>
int main()
{
	int i = 1;
	//在这里将i的地址的首元素强转为char* ,1个字节,然后解引用找到,判断是否为1
	if (*(char*)&i)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

在这里插入图片描述

标签:小端,存储,反码,00000000,补码,内存,原码
来源: https://blog.csdn.net/weixin_52142731/article/details/111491200

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有