例如:
//打印函数字节函数
void ShowBit(byte *bit,int len)
{
for(int i = 0;i< len;i++){
printf("%02X",*bit);
bit++;
}
printf("\n");
}int main()
{
/*省略部分代码*/
   UINT32 uiTmp = 0x3800007E;
   ShowBit((byte*)&uiTmp ,4); 
}为什么输出会变成:0x7E000038  不是说高位在前吗??怎么变成底位在前了。 
无法理解了........

解决方案 »

  1.   

    2008-08-29 13:38一、字节序定义字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:
    a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
    b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
    c) 网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于 TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。比如,以太网头部中2字节的“以太网帧类型”,表示后面数据的类型。对于ARP请求或应答的以太网帧类型来说,在网络传输时,发送的顺序是0x08,0x06。在内存中的映象如下图所示:
    栈底 (高地址)
    ---------------
    0x06 -- 低位 
    0x08 -- 高位
    ---------------
    栈顶 (低地址)
    该字段的值为0x0806。按照大端方式存放在内存中。二、高/低地址与高低字节首先我们要知道我们C程序映像中内存的空间布局情况:在《C专家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图:
    ----------------------- 最高内存地址 0xffffffff
    | 栈底
    .
    .              栈
    .
    栈顶
    -----------------------
    |
    |
    \|/NULL (空洞)/|\
    |
    |
    -----------------------
                    堆
    -----------------------
    未初始化的数据
    ----------------(统称数据段)
    初始化的数据
    -----------------------
    正文段(代码段)
    ----------------------- 最低内存地址 0x00000000以上图为例如果我们在栈上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布局的呢[注1]?看下图:
    栈底 (高地址)
    ----------
    buf[3]
    buf[2]
    buf[1]
    buf[0]
    ----------
    栈顶 (低地址)现在我们弄清了高低地址,接着来弄清高/低字节,如果我们有一个32位无符号整型0x12345678(呵呵,恰好是把上面的那4个字节buf看成一个整型),那么高位是什么,低位又是什么呢?其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。高低地址和高低字节都弄清了。我们再来回顾一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:
    以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:
    Big-Endian: 低地址存放高位,如下图:
    栈底 (高地址)
    ---------------
    buf[3] (0x78) -- 低位
    buf[2] (0x56)
    buf[1] (0x34)
    buf[0] (0x12) -- 高位
    ---------------
    栈顶 (低地址)Little-Endian: 低地址存放低位,如下图:
    栈底 (高地址)
    ---------------
    buf[3] (0x12) -- 高位
    buf[2] (0x34)
    buf[1] (0x56)
    buf[0] (0x78) -- 低位
    ---------------
    栈顶 (低地址)在现有的平台上Intel的X86采用的是Little-Endian,而像Sun的SPARC采用的就是Big-Endian。三、例子嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:内存地址 存放内容
    0x4001    0x12
    0x4000    0x34而在Big-endian模式CPU内存中的存放方式则为:内存地址 存放内容
    0x4001    0x34
    0x4000    0x1232bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:内存地址 存放内容
    0x4003     0x12
    0x4002     0x34
    0x4001     0x56
    0x4000     0x78而在Big-endian模式CPU内存中的存放方式则为:内存地址 存放内容
    0x4003     0x78
    0x4002     0x56
    0x4001     0x34
    0x4000     0x12附:可以用下面的程序测验你的机器是大端字节序还是小端字节序:可以用下面的程序测验你的机器是大端字节序还是小端字节序:
    ----------------------------------------------------------
    #include <stdio.h>
    int IsLittleEndian()
    {
    unsigned int usData = 0x12345678;
    unsigned char *pucData = (unsigned char*)&usData;
    if(*pucData == 0x78)
         return 1;
    else
         return 0;
    }int main(void)
    {
        if(IsLittleEndian())
            printf("is little endian!\n");
        else
            printf("is big endian!\n");
        return 0;
    }track:http://www.cnblogs.com/wqlblogger/archive/2008/01/25/1052915.html
     
      

  2.   

    所以你的机器采用的是Little-Endian
      

  3.   

    主机字节序是什么?
    intel的微机cpu,是小端的。