浮点格式会受big-endian和little endian的影响吗?

我知道big-endian机器和little-endian机器之间的整数格式会有所不同,浮点格式(IEEE 754)是否相同?

浮点数的IEEE754规范根本不包括字节序问题。 因此,浮点数可以在不同的机器上使用不同的表示,并且理论上,甚至可能对于两个处理器,整数字节序是相同的并且浮点不同,反之亦然。

有关更多信息,请参阅此维基百科文章 。

如果你有一个Linux盒子,你可能会有/usr/include/ieee754.h …(注意#if s)

 ... union ieee754_float { float f; /* This is the IEEE 754 single-precision format. */ struct { #if __BYTE_ORDER == __BIG_ENDIAN unsigned int negative:1; unsigned int exponent:8; unsigned int mantissa:23; #endif /* Big endian. */ #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int mantissa:23; unsigned int exponent:8; unsigned int negative:1; #endif /* Little endian. */ } ieee; ... 

一旦考虑由较小单元组成的东西,就会出现字节序问题。 较小单元的排列方式可能会发生变化。

然后,如果您关心FP格式的变化,您必须意识到IEEE 754没有描述FP表示(即使它只有一个图表建议),并且至少还有一个与字节序相关的变体:表示信令子正常的比特在不同的实现中被不同地解释。

以下是无论C编译器如何以可移植的方式处理此问题的建议。 请将此视为伪代码,它在此处编写,现在在我的Web浏览器中编写,未经过测试:

 #include  #include  static uint16_t endian = 0xAABB; #if ( *(const uint8_t*)&endian == 0xAA ) #define BIG_ENDIAN #else #define LITTLE_ENDIAN #endif #ifdef BIG_ENDIAN #define FLOAT_NEGATIVE 0x80000000U #define FLOAT_EXPONENT 0x7F800000U #define FLOAT_MANTISSA 0x007FFFFFU #define SHIFT_NEGATIVE 31U #define SHIFT_EXPONENT 23U #define SHIFT_MANTISSA 0U #elif defined LITTLE_ENDIAN #define FLOAT_NEGATIVE 0x00000001U #define FLOAT_EXPONENT 0x000001FEU #define FLOAT_MANTISSA 0xFFFFFE00U #define SHIFT_NEGATIVE 0U #define SHIFT_EXPONENT 1U #define SHIFT_MANTISSA 9U #endif typedef union { float as_float; uint32_t as_int; } ieee745_t; uint32_t float_negative (ieee745_t ieee); uint32_t float_exponent (ieee745_t ieee); uint32_t float_mantissa (ieee745_t ieee); uint32_t float_negative (ieee745_t ieee) { return (ieee.as_int & FLOAT_NEGATIVE) >> SHIFT_NEGATIVE; } uint32_t float_exponent (ieee745_t ieee) { return (ieee.as_int & FLOAT_EXPONENT) >> SHIFT_EXPONENT; } uint32_t float_mantissa (ieee745_t ieee) { return (ieee.as_int & FLOAT_MANTISSA) >> SHIFT_MANTISSA; } int main() { ieee745_t f = {-1.23f}; printf("%f\n", f.as_float); printf("Negative:\t%X\n", float_negative(f) ); printf("Exponent:\t%X\n", float_exponent(f) ); printf("Mantissa:\t%X\n", float_mantissa(f) ); getchar(); return 0; }