简单理解大端小端
作者:互联网
数是按字节存储的
十进制数4660是如何在计算机内存中存储的?我们知道计算机存储的单元是字节,4460转换成十六进制,一共有四字节,因为
char arr[] = { 0x12,0x34 };
std::cout << "Big Endian will be:";
std::cout << ((0x34 << 8) + 0x12) << std::endl;
std::cout << "Little Endian will be:";
std::cout << ((0x12 << 8) + 0x34)<<std::endl;
char arr2[] = { 0x34,0x12 };
std::cout<<*(uint16_t *)arr2;
地址高低是什么意思?
假设我们眼前有一张充满格子的稿纸,规定从左往右,先写下的称为低地址,后写下的是高地址,这个规定和大小端没有关系。
中国古文正规的书写方式是:竖书成行,自上而下写满一行后,再自右向左换行。
对于一个词“你好”,正常情况,“你”写在左边,“好”写在右边,换句话说,“你”在低位,“好”在高位;当然如果你要特立独行一下,你也可以反过来,,“好”写在左边,“你”写在右边,换句话说,“你”在低位,“好”在高位;
左边的格子 | 右边的格子 |
---|---|
你 | 好 |
好 | 你 |
因为这是一个有意义的词,我们在阅读到这个词时,可以明确知道表达的是问候词“你好”,
假设我们将一个欠款金额写在纸上,按照默认习惯2在左侧,1在右侧。
左边的格子 | 右边的格子 |
---|---|
2 | 1 |
这时候,写的顺序就尤为重要,因为不规定书写顺序,可能回导致不同的欠款金额:
- 从左往右正常写:21块
- 从右往左特殊写:12块
好家伙,差了9块钱。这也就说明,书写顺序对于解读来说是必要的,不同书写顺序可能导致记录的内容有不同的解读。
在计算机领域,正常写,我们称为大多数人写的方式为大端;特殊写,小部分人书写的方式为小端。一个系统是以大端或小端进行读写,取决于具体的CPU类型:
- 大端模式:PowerPC、IBM、Sun;
- 小端模式:x86、DEC、STM32;
- ARM既可以工作在大端模式,也可以工作在小端模式;
那么在实际编程中,这个规则是如何体现的呢?
我们知道计算机是以字节为单位存储数据,对于一个int型数据0x12345678(32位),必须将这个数分为四个字节写入以字节为计算机内存,顺序取决于计算机端种类。观察下面程序:
int a = 0x12345678;
char* ptr = (char *)&a;//因为char *恰好是一个字节,指针+1等于移动至下一个字节
std::cout << std::hex << (int)*ptr << std::endl;;
std::cout << std::hex << (int)*(ptr + 1) << std::endl;
std::cout << std::hex << (int)*(ptr + 2) << std::endl;
std::cout << std::hex << (int)*(ptr + 3) << std::endl;
如果是一个大端系统,那么那就应该是12 34 56 78;如果是一个小端系统,那么则为0x78 56 34 12,因为程序运行在x86,所以结果如下:
没错他是一个小端系统。
标签:小端,顺序,字节,格子,书写,char,理解,大端 来源: https://blog.csdn.net/weixin_39258979/article/details/118723479