背景知识
大端模式:内存的低地址存放数据的高字节,内存的高地址存放数据的低字节。
小端模式:内存的低地址存放数据的低字节,内存的高地址存放数据的高字节。
下面以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,用unsigned char buf[4]来表示value。
大端模式:内存的低地址存放数据的高字节
---------------------------------------低地址
buf[0] (0x12) – 高位字节
buf[1] (0x34)
buf[2] (0x56)
buf[3] (0x78) – 低位字节
-------------------------------------高地址
小端模式:内存的低地址存放数据的低字节
---------------------------------------低地址
buf[0] (0x78) – 低位字节
buf[1] (0x56)
buf[2] (0x34)
buf[3] (0x12) – 高位字节
-------------------------------------高地址
以表格形式体现大小端模式的区别
内存地址 | 小端模式存放内容 | 大端模式存放内容 |
---|---|---|
0x4000 | 0x78 | 0x12 |
0x4001 | 0x56 | 0x34 |
0x4002 | 0x34 | 0x56 |
0x4003 | 0x12 | 0x78 |
判断系统是大/小端模式的程序设计
#include
<
stdio.h>
typedef unsigned char byte;
// 转换char(视为整数类型)为16进制字符串
void ChtoHex(byte Val, char* dest)
{
// 辗转相除法,倒序看得到结果
byte tmp = Val % 16;
if (tmp >= 0 && tmp <= 9)
{
dest[1] = '0' + tmp;
}
else if (tmp >= 10 && tmp <= 15)
{
dest[1] = 'A' + tmp - 10;
}
tmp = (Val/16) % 16;
if (tmp >= 0 && tmp <= 9)
{
dest[0] = '0' + tmp;
}
else if (tmp >= 10 && tmp <= 15)
{
dest[0] = 'A' + tmp - 10;
}
// 设置\0
dest[2] = '\0';
}
// 主函数
void main()
{
int u = 367328153; // 原始数据,8位16进制为15 E4 FB 99
byte a, b, c, d; // u从低地址到高地址的四个字节
// a~d对应的16进制字符串,预留3个字符
char Sa[3], Sb[3], Sc[3], Sd[3];
byte* k = (byte*)&u;
a = k[0];
b = k[1];
c = k[2];
d = k[3];
// 转成16进制字符串
ChtoHex(a, Sa);
ChtoHex(b, Sb);
ChtoHex(c, Sc);
ChtoHex(d, Sd);
printf("%s %s %s %s\n", Sa, Sb, Sc, Sd);
scanf_s("%d", &a);
}
控制台显示的结果是99 FB E4 15,与直接求出来的16进制值15 E4 FB 99正好相反,证明是小端的。