端是什么?
“我们常说的大端小端模式是计算机中 字节顺序(Endianness) 常见的两种表现形式。(此外还有混合序 (Middle-Endian))
“endian”一词来源于十八世纪爱尔兰作家乔纳森·斯威夫特(Jonathan Swift)的小说《格列佛游记》(Gulliver's Travels)。小说中,小人国为水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开而争论,争论的双方分别被称为“大端派”和“小端派”。”
上文来自《深入理解计算机系统》。
大端小端指的是内存中字节存储的顺序,从高往低是大端,从低往高是小端。
是大端还是小端是由什么决定?
是由CPU决定的,内存因为CPU而决定大端、小端的展现形式。
怎么知道自己的CPU是大端序还是小端序?
int checkCPU(void) { union { int a; char b; }c; c.a = 1; return (c.b == 1); }
定义一个整型变量test
并初始化为1。使用指针类型转换将整型变量test
的地址转换为字符指针类型。通过访问该字符指针的第一个元素(即最低位字节),判断其值是否为1。如果第一个元素的值为1,则输出"小端",表示计算机采用小端字节序;否则输出"大端",表示计算机采用大端字节序。
#include <stdio.h>
int main()
{int test=1;if(((char *)&test)[0]){printf("小端");}else{printf("大端");}return 0;
}
知道了这个有什么用?
模块通讯,网络传输,这些都需要我们知道字节的发送顺序。
网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序.
高/低字节定义:在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78.
有大端为什么要有小端?有小端为什么要有大端?
大端更符合人类阅读习惯,小端更具性能优势。个人更倾向小端。