数据存储IEEE754,尾部大小不一

时间:2019-06-20 20:40:37

标签: floating-point endianness

我目前正在学习一些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|

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

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

我对吗?

我现在有点困惑,因为这必须表示例如数字符号的位是AB字节的第一个,不是吗? 有人可以确认或解释下表是否正确地“转移”到小尾数法:

|--------- 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|

非常感谢您!

1 个答案:

答案 0 :(得分: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字节的第一个,不是吗?

没有理由混淆。在内存中,符号位确实是小端架构上浮点表示形式的第四个字节的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|