• 关于x86系统中“大小端”在C++中的应用实例分析


    本文主要是关于一个由“大小端”引发的问题的具体分析。

    笔者在百度知道看到一个提问,内容如下:

    为什么此函数输出 moring? s=&x是为什么呢?
    引用自:http://zhidao.baidu.com/question/545637515.html?fr=uc_push&push=&group=1
    #include <iostream>
    using namespace std;
    int main(){
     union{
      char word[8];
      short int ksi[5];
      }x,*s;
     s=&x;
     s->ksi[0]=0x4f43;
    s->ksi[1]=0x504d;
    s->ksi[2]=0x5455;
    s->ksi[3]=0x5245;
    s->ksi[4]=0x0021;
    cout<<s->word<<endl;
    return 0;
    }

    下面是由这个问题,而引发的笔者的思考:

    首先,这个问题很明显是关于“大小端”的问题,即“BigEndian” 和 “SmallEndian”。

    关于大小端的问题,在笔者转载的另一篇文章中,已经有较详细的解说(http://blog.csdn.net/it1988888/article/details/7765997)。

    但是,把“大小端”的问题具体化到这个百度知道的问题上,主要有2点总结要说:

    一是,所谓的“小端Little-Endian”,就是“低地址存放最低有效位(LSB),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端”。同理,“大端”的解释反之;

    二是,Intel X86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。

    如果明白了上面两点总结,那么这个问题就迎刃而解了。

    首先可以确定的是,百度知道上这个问题的提问者用的十有八九是x86的计算机(否则,如果提问者用的是诸如PowerPC等的大端模式的计算机,那么那个字符串或称字符数组就没有具体的英文意义了)。

    其次,回上程序上来看,程序中有一个联合体Union,该联合体中的word数组和ksi数组的指针指向同一段内存空间,即共享同一段存储空间。

    把两个数组分别展开,如下所示: 

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    MemoryAddress:        Low --> High

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    ksi[x]:                             0                       1                          2                            3                                4

    

    (Value)                          0x4f43             0x504d               0x5455                  0x5245                    0x0021 

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    word[y]:                         0            1          2           3            4              5            6               7              8

    (Value)                          0x43     0x4f    0x4d      0x50      0x55       0x54      0x45        0x52        0x21 

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    ASCII:                           C           O         M           P            U             T             E             R             !

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    由上表可知,最终程序打印出来的字符串是“COMPUTER!”,而非提问者所说的“moring?"。所以说,做学问应该要有严谨的科学方法,经过严谨推论得出的结论,是不因为他人的其它说法而动摇的而且是符合真理和科学的结论。
    回到问题的解答上,其中word数组与ksi数组共享同一段存储空间,以ksi[0]为例,它所指向的存储空间中有2个字节的容量,这2个字节的空间中,即存储着word[0]的值,同进度也存储着word[0]和word[1]的值,然后从前面已知x86系统中是“小端模式存储方式”,那么ksi[0]中低字节的一半值0x43就应该存储在相对低地址的空间中,恰巧这个相对低地址的空间也被word[0]共享;而高字节的一半值0x4f就应该存储在相对高地址的空间中,这个相对高地址的空间也被word[1]共享。同理可得这两个数组中其它地址中相对应的值,最终经常在x86系统中运行验证,的确打印出来的信息就是字符串“COMPUTER! "。

  • 相关阅读:
    nginx+uWSGI+django+virtualenv+supervisor发布web服务器
    Nginx负载均衡
    python操作 redis
    Python之Linux下的 virtualenv
    python习题:写一个函数-校验字符串是否为合法的小数
    python习题:修改文件里的内容
    python习题:如果同一个ip地址60s之内访问超过200次,那么就把这个ip地址加入黑名单
    python自动化测试-D4-学习笔记之三(函数)
    python自动化测试-D4-学习笔记之二(集合)
    python自动化测试-D4-学习笔记之一(文件读写补充)
  • 原文地址:https://www.cnblogs.com/techstone/p/3321302.html
Copyright © 2020-2023  润新知