[置顶] 彻底理解字节序

一、什么是字节序? 

1. 字节序是一个处理器架构特性,用于指示像整数这样大数据类型的内部字节顺序。几乎所有的机器上,多字节对象都被存储为连续的字节序列 运行在同一台电脑上的进程在在英特尔的计算机上,低位字节被优先存储。这意味着像 0x1234 十六进制单词存储作为 (0x34 0x12) 在内存中,而对于四个字节的0x12345678 将存储为 (0x78 0x56 0x34 0x12)。


二、为什么会有字节序问题?

假定内存中有以下数据,现在有两颗不同架构的cpu芯片cpu1和cpu2。

   低地址                                            高地址
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     12     |      34    |     56      |     78    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

当读取一个字节的时候,cpu1和cpu2读取的结果都是0x12;当读取两个字节时,cpu1读取的结果是x12,x34,而cpu2读取的结果是x34,x12;就有了不同的结果,产生了所谓的字节序问题。(###只有读取大于2个字节的时候才会涉及字节序的问题###


三、什么时候要考虑字节序问题?

拿我们书写方式举例。一般人都是从左向右书写,但是你偏学古人从右向左书写,我想别人阅读的时候肯定误解(当然聪明的人类可以自己校正阅读方式)。对计算机来说这就比较困难了,不同架构的cpu可能有不用的字节读取方式,所以在不用cpu之间处理数据时难免会被误解。因此当要在不同计算机(cpu架构)之间处理数据时,一定要考虑字节序问题。


四、如何判断当前机器的字节序呢?

 一个简单的办法是,给一个整数赋个值0x04030201。然后让一个char类型的指针指向这个整数,打印这个char,就可以知道字节序了。

#include <stdio.h>
int main(void)
{
    int iNum = 0x04030201;
    char *pcNum = &iNum;
     
    if (*pcNum == 0x04)
       puts("big edum\n");
    else if (*pcNum == 0x01)
       puts("small edum\n");
 
    return 0;
}

五、有什么办法记住字节序的特征吗?

有的,在此附上一个毕胜诀:低地址存低位为小端(你阅读起来别扭,阿拉伯人阅读习惯),低地址存高位则大端(你阅读起来很自然,亚洲人阅读习惯)。


文章推荐    http://blog.csdn.net/liuxingen/article/details/45420455/

你可能感兴趣的:(字节序)