大端和小端模式
所属分类 c
浏览量 880
大端模式(Big-endian)
高位字节排放在内存的低地址端,低位字节排放在内存的高地址端,即正序排列,高尾端
符号位的判定固定为第一个字节,容易判断正负
小端模式(Little-endian)
低位字节排放在内存的低地址端,高位字节排放在内存的高地址端,即逆序排列,低尾端
强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样
无论是小端模式还是大端模式 每个字节内部都是按顺序排列
java 里的定义
java.nio.ByteOrder
BIG_ENDIAN LITTLE_ENDIAN
little-endian byte order.
In this order, the bytes of a multibyte value are ordered from least significant to most significant.
significant 显著的重要的
from least significant to most significant
由小到大
16bit宽的数 0x1234
地址从左到右 ,由低到高
大端 0x12 0x34 (正序)
小端 0x34 0x12 (逆序)
为什么会有大小端之分
计算机中以字节为单位,每个地址单元对应一个字节,一个字节 8 bit
16 bit 的 short型,32bit的int型
多个字节安排
常用的X86结构是小端模式
而KEIL C51则为大端模式
很多的ARM,DSP都为小端模式
有些ARM处理器还可以由硬件来选择是大端还是小端模式
常见的字节序
一般操作系统都是小端,而通讯协议是大端的
Java和所有的网络通讯协议都是使用Big-Endian的编码
常见CPU的字节序
Big Endian : PowerPC、IBM、Sun
Little Endian : x86、DEC
ARM既可以工作在大端模式,也可以工作在小端模式。
常见文件的字节序
Adobe PS – Big Endian
BMP – Little Endian
DXF(AutoCAD) – Variable
GIF – Little Endian
JPEG – Big Endian
MacPaint – Big Endian
RTF – Little Endian
大小端测试
union 占用空间等于其最大的成员所占的空间
对变量的存取都是从 union 的首地址开始
在同一个存储空间里存储不同类型数据
byteorder.c
#include "stdio.h"
union{
short i;
char a[2];
}u;
int main(){
// 4386 8721
printf("%d %d \n",0x1122,0x2211);
u.a[0] = 0x11;
u.a[1] = 0x22;
// 小端 0x2211 8721
// 大端 0x1122 4386
printf("0x%x %d \n",u.i,u.i);
//
short i = 0x1122;
char* a = (char*)&i;
// 小端 0x22 0x11
// 大端 0x11 0x22
printf("0x%x 0x%x \n",*(a+0),*(a+1));
return 0;
}
大小端转换
htonl htons ntohl ntohs 等函数
htonl() //32位无符号整型的主机字节顺序到网络字节顺序的转换(小端->>大端)
htons() //16位无符号短整型的主机字节顺序到网络字节顺序的转换 (小端->>大端)
ntohl() //32位无符号整型的网络字节顺序到主机字节顺序的转换 (大端->>小端)
ntohs() //16位无符号短整型的网络字节顺序到主机字节顺序的转换 (大端->>小端)
主机字节顺序,X86一般多为小端(little-endian),网络字节顺序,即大端(big-endian)
上一篇
下一篇
NULL 与 nullptr
c++ 变量名 冲突
c++ rapidjson 使用
c++ header-only library
c++ 标准输入输出
using namespace std 与 using std::cout