【计算机基础】字节序

字节序

计算机最小的存储单位是 位(Bit),但是,计算机中最基本的存储单位是字节(Byte)

1 Byte = 8 Bit

计算机在存储大于1字节的数据时,会将这个数据拆分为多个字节,再将它们按顺序存储起来,存储和读取这些字节的顺序,就是字节序

定义

字节序(Endianness),即计算机在存储或读取数据时,字节的顺序。

分类

字节序分为 大端序(Big endian)小端序(Little endian)

  • 大端序:高位字节在前,低位字节在后。
  • 小端序:低位字节在前,高位字节在后。

img

上图转自阮一峰老师的博客


人读写数字的顺序就是大端序,人在读(写)数字时,总是先读(写)高位,再读(写)低位。

例如:对于数字520

  • 在写数字的时候,先写5,再写2,最后写0
  • 在读数字的时候,先读5,再读2,最后读0

而在计算机的存储中,一般都是小端序存储。

同时,还有主机序和网络序的概念:

  • 主机序小端序
  • 网络序大端序

实战(基于C语言)

  1. 判断计算机是大端序还是小端序

    #include <stdio.h>
    
    union {
    	short a;
    	char b[2];
    } un;
    
    int main()
    {
    	un.a = 0x1234;
    	if(un.b[0] == 0x34)
    	{
    		printf("小端序"); 
    	}
    	else if(un.b[0] == 0x12)
    	{
    		printf("大端序");
    	}
    	 
        return 0;
    }
    

    说明

    C语言中,short是16位整数,所以会被拆成两个字节存储,我们将一个short类型的整数赋值为0x1234,如果它先存储0x34(即它的低位字节),就是小端序;反之,如果它先存储0x12(即它的高位字节),就是大端序。

  2. 利用指针转换字节数组和基本类型

  • 字节数组转short(单个数字)

    #include <stdio.h>
    
    int main()
    {
    	char chs[2] = {0x34, 0x12}; // 小端序数据0x1234
    	
    	short a = *((short*)chs);
    	
    	printf("0x%X", a); // 输出0x1234
        
        return 0;
    }
    
  • 字节数组转short(多个数字)

    #include <stdio.h>
    
    int main()
    {
    	char chs[4] = {0x34, 0x12, 0x78, 0x56}; // 小端序数据0x1234, 0x5678
    	
    	short a = *((short*)chs);
    	short b = *((short*)(chs+2));
    	
    	printf("0x%X \n", a); // 输出0x1234
        printf("0x%X \n", b); // 输出0x5678
        
        return 0;
    }
    
  • short转字节数组

    #include <stdio.h>
    
    int main()
    {
    	char chs[2];
    	short a = 0x1234;
    	
    	for(int i = 0; i < 2; i++)
    	{
    		chs[i] = ((char*)&a)[i];
    	}
    	
        // 小端序计算机将输出: chs[0]=0x34, chs[1]=0x12
    	printf("chs[0]=0x%X \n", chs[0]);
    	printf("chs[1]=0x%X \n", chs[1]);
        return 0;
    }
    
  1. 利用联合体转换字节数组和基本类型

    #include <stdio.h>
    
    union {
    	short a;
    	char chs[2];
    } un;
    
    int main()
    {
    	//将short转换为字节数组// 
    	un.a = 0x1234; 
    	
    	// 小端序计算机将输出: chs[0]=0x34, chs[1]=0x12
    	printf("chs[0]=0x%X \n", un.chs[0]);
    	printf("chs[1]=0x%X \n", un.chs[1]);
    	
    	
    	//将字节数组转换为short// 
    	un.chs[0] = 0x78;
    	un.chs[1] = 0x56;
    	printf("a=0x%X \n", un.a); // 输出0x5678 
    	
        return 0;
    }
    
  • 0
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值