大小端字节
大小端字节的妙用
一. 什么是大小端字节序
- 字节序概念在计算机内存中或在数据通信链路中,由多个字节组成的数据的字节排列顺序,简单来说,就是当一个数据大于一个字节时(例如,一个int类型通常是四个字节)即如何排列这些字节的。
- 例:int a=0x11223344
大端 :低地址存高数据,高地址存低数据。
| 11 | 22 | 33 | 44 |
|---|
小端:高地址存高数据,低地址存低数据
| 44 | 33 | 22 | 11 |
|---|
- 小端字节序更符合计算机处理数据的方式,因为计算通常从最低位开始,这样可以提高电路处理效率。
* 是大多数现代处理器架构的最主流选择,例如Intel的x86和大多数ARM实现 - 大端字节序与人类阅读数字的习惯一致,从左到右按顺序排列。(又称网络字节序)
- 注:内存地址默认从低到高增长,但字节序决定的是“高位字节先放还是低位字节先放”。
二.大小端的优势
- 大端:
- 可读性好:存储顺序和人类的阅读习惯一致。
- 符号判断快:只需要检查第一个字节就可以判断一个数的正负。
- 小端:
- 计算效率高:计算机电路从低位字节开始处理效率更高。例如:在进行加法或乘法运算时,CPU从低位到高位处理更方便。
- 类型转换方便:强制类型转换时,无需修改地址即可直接获取低位字节的数据。例如,将一个32位整数强制转换为16位整数,在小端系统里,直接去前两个字节即可。所以,回顾之前我们讲解的,强制类型转换就是容易丢失数据。
三.判断当前字节序
#include<stdio.h>intcheck_sys(intn){char*pc=(char*)&n;if(*pc==0x44){return1;}return0;}intmain(){inta=0x11223344;intret=check_sys(a)if(ret==1){printf("当前为小端字节序");}else{printf("当前为大端字节序");}return0;}推荐用union的写法,直观且不易踩坑:
#include<stdio.h>// 返回 1 为小端,返回 0 为大端intcheck_sys(void){union{inta;charb;}u={.a=1};// int 为 0x00000001returnu.b;// 读低地址处的那个字节:小端为 1,大端为 0}intmain(void){printf(check_sys()?"小端\n":"大端\n");return0;}如果习惯用指针写法,判断条件不要硬编码具体数值,应比较"低地址处的字节是否等于最低位字节":
#include<stdio.h>intcheck_sys(intn){char*pc=(char*)&n;return*pc==(char)(n&0xFF);// 低地址存的是最低位字节 → 小端}intmain(void){inta=0x11223344;printf(check_sys(a)?"小端\n":"大端\n");return0;}当然还有其他方法,欢迎来评论区分享