大端与小端浮点数有什么区别?

11

对于整数值,小端和大端表示法的区别相当简单。

但是对于我来说,小端浮点数与大端浮点数的区别不太清楚。

最后,我想知道哪种更常用。


11
字节序(endianness)影响着所有多字节类型在内存中的表示方式,包括浮点数和32位整数。在这方面上,浮点数并没有不同。 - Jeff Mercado
这4个字节只是以相反的顺序存储。 - Hans Passant
4
让我困惑的是浮点数的表示方式不像整数那样按字节分割。它的符号位占1位,指数占8位,尾数占23位。如果反过来排列,将使得访问这些值更加困难。 - André Puel
5
André,你提到了完全不同的事情。字节顺序是数字表示之下的一层。整数和浮点数与字节序无关;它们只是多字节值。同样,字节序也不在意是整数还是浮点数。它只是按特定顺序存储字节。 - Joey
“这4个字节只是以相反的顺序存储。”?如何理解这句话?你能为我详细解释一下吗? - John
2个回答

17

字节序是由构成多字节值的各个字节所决定的属性。浮点数占用4或8个字节,字节序告诉你应该以什么顺序读取它们。这与整数值完全相同。


8

一些资料称IEEE754浮点数总是以小端存储,但IEEE754浮点数规范并没有涉及字节序问题,因此可能因计算机而异。

以下是浮点数/字节数组转换的示例代码:

#include <stdio.h>

int main(int argc, char** argv){
  char *a;
  float f = 3.14159;  // number to start with

  a = (char *)&f;   // point a to f's location

  // print float & byte array as hex
  printf("float: %f\n", f);
  printf("byte array: %hhX:%hhX:%hhX:%hhX\n", \
    a[0], a[1], a[2], a[3]);

  // toggle the sign of f -- using the byte array
  a[3] = ((unsigned int)a[3]) ^ 128;

  //print the numbers again
  printf("float: %f\n", f);
  printf("byte array: %hhX:%hhX:%hhX:%hhX\n", \
    a[0], a[1], a[2], a[3]);

  return 0;
}

在小端机器上的输出:

浮点数:3.141590 字节数组:D0:F:49:40 浮点数:-3.141590 字节数组:D0:F:49:C0

理论上,在大端机器上,字节的顺序将会被颠倒。

参考资料: http://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/


4
在SPARC机器上:浮点数为3.141590,字节数组为40:49:F:D0;浮点数为3.141560,字节数组为40:49:F:50。 - automaciej
这就是我如何实现它的! - Owl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接