【问题标题】:Data storage IEEE754 with little and big endian具有小端和大端的数据存储 IEEE754
【发布时间】:2019-06-20 20:40:37
【问题描述】:

我目前正在学习一些 IT 知识,并且有一个可能非常简单的问题.. 我的任务是计算 4 个字节的内存转储的十进制输出,存储为小端(IEEE754)。我的书只解释了如何处理数据存储时的计算类型:

|--------- Byte 1 --------|--------- Byte 2 -------------|--------- Byte 3 ------------|--------- Byte 4 ------|
|sign e7 e6 e5 e4 e3 e2 e1|e0 m22 m21 m20 m19 m18 m17 m16|m15 m14 m13 m12 m11 m10 m9 m8|m7 m6 m5 m4 m3 m2 m1 m0|

我对小/大端没有任何有用的描述...... 我花了很多时间,发现上面的表格必须存储为大端。 little endian 的描述是第一个字节在第 4 个字节的位置,第二个在第 3 个字节,第三个在第 2 个字节,第四个在第一个地址。

Example:
Big endian: AB CD EF 01
Little endian: 01 EF CD AB

我说得对吗?

我现在有点困惑,因为这一定意味着例如数字的符号位是 AB Byte 的第一个,不是吗? 有人可以确认或解释下表是否正确“转移”到小端:

|--------- Byte 1 ------|--------- Byte 2 ------------|--------- Byte 3 -------------|--------- Byte 4 --------|
|m7 m6 m5 m4 m3 m2 m1 m0|m15 m14 m13 m12 m11 m10 m9 m8|e0 m22 m21 m20 m19 m18 m17 m16|sign e7 e6 e5 e4 e3 e2 e1|

非常感谢!!!

【问题讨论】:

    标签: floating-point endianness


    【解决方案1】:

    您的解释完全正确。可以通过简单的程序轻松验证。

    #include <stdio.h>
    #include <string.h>
    
    int main() {
    
      float f=-123456.75f;
      int i;
      unsigned char c[4];
    
      memcpy(c,&f,4);
      memcpy(&i,&f,4);
      printf("decimal representation of f: %f\n",f);
      printf("hex representation of f: %a\n",f);
      printf("hex value of integer with the same bytes as f:  %x\n",i);
      printf("sucessive bytes in f (0:3): %.2x %.2x %.2x %.2x\n",c[0],c[1],c[2],c[3]);
      /* gives
    decimal representation of f: -123456.750000
    hex representation of f: -0x1.e240cp+16
    hex value of integer with the same bytes as f:  c7f12060
    sucessive bytes in f (0:3): 60 20 f1 c7
      */
    }
    

    我现在有点困惑,因为这一定意味着例如数字的符号位是 AB Byte 的第一个,不是吗?

    没有理由感到困惑。在内存中,符号位确实是小端架构上浮点表示的第四个字节的 MSB。
    但是字节序只关心字节是如何存储在内存中的。无论字节顺序如何,一旦加载到寄存器中并由程序操作,行为将是相同的。
    我们习惯于从左到右书写,并以最高有效位开始数字。但只要保留数学属性,其他表示方案也完全有效。
    如果它可以帮助您,请在左侧写入具有最低有效位的字节(但在计算机上左右没有意义)。

    |--------- Byte 1 ------|--------- Byte 2 ------------|--------- Byte 3 -------------|--------- Byte 4 --------|
    |m0 m1 m2 m3 m4 m5 m6 m7|m8 m0 m10 m11 m12 m13 m14 m15|m16 m17 m18 m19 m20 m21 m22 e0|e1 e2 e3 e4 e5 e6 e7 sign|
    

    【讨论】:

    • 非常感谢您的回答!最后一个问题:以下数据存储在这四个字节中:字节1,地址0x100:AA(十六进制);字节2,地址0x101:BB;字节 3,地址 0x102:CC;字节 4,地址 0x103:DD;这意味着符号是这个双数字中突出显示的位置:11011101,对吗?字节的存储顺序是像我刚刚描述的那样,还是反之亦然?
    • 是的,看起来是这样,但这取决于您的硬件。使用提供的代码并更改数字的符号。考虑正负数的结果,符号位的位置会很明显。
    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多