【问题标题】:Determining the hexadecimal values of an address of a little endian machine确定小端机器地址的十六进制值
【发布时间】:2019-08-28 16:49:23
【问题描述】:

我对你将如何解决这个问题有点困惑:

考虑十进制数 1027。该值作为 16 位二进制补码数存储到地址为 124 和 125 的 little endian 机器上,该机器具有一个字节的可寻址单元大小。每个地址中有哪些值(十六进制):

124:

125:

我知道一个小端机器将它的地址从最低有效字节排序到最高有效字节。但除此之外,我不确定您将如何应用该概念以及如何将字节排序到地址中。

【问题讨论】:

    标签: c endianness machine-code


    【解决方案1】:

    “Little endian”和“big endian”与机器如何将内存中的字节多路复用到 CPU 的寄存器中有关。

    每得到一个字节,它就会增加地址计数器,但它是从左到右还是从右到左将这些字节放入寄存器中?

    因此,加载到机器寄存器(或整数)中的地址可以反向存储在内存中。即使现代 CPU 具有广泛的数据总线,这一概念仍然存在,并且在某些 CPU 中,字节会在 CPU 内部进行交换。

    【讨论】:

      【解决方案2】:

      每个大于 char 的整数类型都考虑了小端和大端的概念。

      当您编写 C 代码时,您不必担心小端和大端。例如,如果您有 int X=100, Y=200;,那么 X+Y 在 C 的每个实现上都会一直返回 300。

      但是,当您需要在机器之间传送数据时,您需要考虑到您可能会在大端机器上接收来自小端的数据,反之亦然。在这种情况下,您需要将小端转换为大端(为此,套接字库具有专门的功能)。

      另一方面,在 C 中,int 类型的整数不是保存在 16 位上,而是至少保存在 16 位上。

      要查看机器是小端还是大端,您可以将值 X 初始化为 256 并提取前 8 位并查看它们是否为 0。 *((unsigned char*)&X)&((1<<8)-1))!=0。根据此表达式的结果,您可以定义宏 LITTLE_ENDIAN 或 BIG_ENDIAN

      要读取整数的每个字节,可以定义这样的结构

      typedef struct {
      #if LITTLE_ENDIAN
      unsigned char low;
      unsigned char high;
      #elif BIG_ENDIAN
      unsigned char high;
      unsigned char low;
      #endif
      } order_integer;
      

      然后您可以使用

      对整数进行排序
      x=400; 
      order_integer *o=(order_integer*)&x; 
      printf("%u %u\n", o->low, o->high);
      

      如果您想从寻址 124 和 125 读取整数(假设您检查并确定 sizeof int = 2),那么您可以这样做:

      order_integer *o = (order_integer*)124;
      printf("%u %u\n", o->low, o->high);
      

      【讨论】:

      • 我不确定这如何回答“您如何将字节排序到地址中?”的问题
      • @ForceBru 我添加了
      【解决方案3】:

      下面是一些简单的 Python 代码,用于将该整数转换为 little-endian 十六进制表示:

      # convert the integer (1027) to hex using 2 bytes and little-endian byteorder
      (1027).to_bytes(length=2, byteorder='little').hex()
      

      这给出了0304。因此,第一个字节 (03) 位于地址 124 中,第二个字节 (04) 占用下一个地址 - 125。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 2016-11-04
        • 2021-11-28
        • 1970-01-01
        相关资源
        最近更新 更多