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

整形在内存中的存储

整形在内存中的存储

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

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

例如:一个 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;
}

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

上一篇:深度剖析Java集合之BitSet


下一篇:【计算机基础】在0和1的世界里来来回回