(C语言中整形的大小端存储)


1.案例引入

众所周知,在IDE Visual studio中,调试后可以在内存窗口中看见程序中一些变量的地址以及值 我们这里将一个16进制数字0x12345678存到内存中

int main()
{
	int a = 0x12345678;
	return 0;
}

按下F10后进入调试,打开内存窗口,找到变量a的地址,发现a中值存储的是:78 56 34 12 在这里插入图片描述 存在内中的顺序好像倒置了,但又没完全倒置 所以这就需要了解内存中大小端存储的知识了。


2.大小端存储

十六进制数字的每一位占0.5字节,所以一个字节是十六进制数字中的两位。 在存储十六进制的数字时,以一字节为单位进行存储,也就是0x12345678会以12,34,56,78的分块形式存储在内存中

所以十六进制数字中这四个字节如何在内存中排序就是一个问题,也就有了大端小端的说法


2.1大端存储

  • 大端存储也被称为大端字节序存储
  • 大端存储就是把一个数据的低位字节的内容放到高地址处,高位字节的内容放到低地址处 在这里插入图片描述

2.2小端存储

  • 小端存储也被称为小端字节序存储
  • 小端存储就是把一个数据的低位字节的内容放到低地址处,高位字节的内容放到高地址处 在这里插入图片描述

所以,可以在内存窗口中看出,visual studio 这个IDE是采用的是小端存储 不同的IDE 会采用不同的存储方法

2.3为什么会有大端小端

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

3.判断机器的字节序

这里的思想是,如果将1放到内存中,其16进制表示为:0x 00 00 00 01 如果按照大端存储就是: 01 00 00 00 如果按照小端存储就是: 00 00 00 01 假如能够取出内存中的第一个字节,如果为1就是大端存储,如果不是1就是小端存储

#include <stdio.h>
int check_sys()
{
	int i = 1;
	return (*(char *)&i);
}
int main()
{
	int ret = check_sys();
	if(ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

此程序最主要的点就是取出第一个字节里的内容 先取i的地址,在将i的地址强制类型转换成char*,再解引用,就取出了第一个字节