计算机存储,字节分为大端和小端

1:认识

对于一个int类型的数字,如int data=0x01234567; 最高位是0x01 最低位是 0x67

大端存储: 高位字节排在内存的低地址,低位字节排在内存的高地址端 ==》符合我们的阅读

小端存储:低位字节排在内存的低地址 高位字节排在内存的高地址端 ==》计算机电路先处理低位字节,效率较高

2:demo

//测试本机是大端还是小段:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <netinet/in.h>
int main()
{
    
    
	int data=0x01234567;   //高字节是0x01 
	//以十六进制输出数据 及该数据对应的地址
	printf("data:[%x] data_addr:[%p] \n",data, &data);

	char *c_data = (char *)&data;
	for(int i=0; i<4;i++)
	{
    
    
		printf("addr[%p]==>%x \n", c_data+i, *(c_data+i));
	}
	//高位字节排在内存的低地址,低位字节排在内存的高地址端 为大端
	//低位字节排在内存的低地址  高位字节排在内存的高地址端 为小端
	if(*c_data == 0x01)  //低位存高字节
	{
    
    
		printf("this is big endian\n");
	}else{
    
       //低位存低字节
		printf("this is little endian\n");
	}
	//字节序的转换
	data = htonl(data);
	printf("data is :%x data_addr:[%p] \n", data, &data);
	for(int i=0; i<4;i++)
	{
    
    
		printf("addr[%p]==>%x \n", c_data+i, *(c_data+i));
	}
	return 0;
}

/*************************************************
hlp@ubuntu:~/0922$ ./big
data:[1234567] data_addr:[0x7ffcd98f44a8] 
addr[0x7ffcd98f44a8]==>67 
addr[0x7ffcd98f44a9]==>45 
addr[0x7ffcd98f44aa]==>23 
addr[0x7ffcd98f44ab]==>1

根据输出结果,说明我的电脑内存是小端

计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。
	所以,计算机的内部处理都是小端字节序。
但是,人类还是习惯读写大端字节序。
	所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,
	比如网络传输和文件储存
*************************************************/

猜你喜欢

转载自blog.csdn.net/yun6853992/article/details/120546813