我知道big-endian机器和little-endian机器之间的整数格式会有所不同,浮点格式(IEEE 754)是否相同?
答案 0 :(得分:12)
浮点数的IEEE754规范根本不包括字节序问题。因此,浮点数可能在不同的机器上使用不同的表示,理论上,对于两个处理器,整数字节序相同且浮点不同或反之亦然。
有关详细信息,请参阅this wikipedia article。
答案 1 :(得分:2)
如果你有一个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;
...
答案 2 :(得分:2)
这是一个建议,无论C编译器如何以可移植的方式处理它。请将此视为伪代码,它在此处编写,现在在我的Web浏览器中编写,未经过测试:
#include <stdint.h>
#include <stdio.h>
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;
}
答案 3 :(得分:1)
当您考虑由较小单位组成的内容时,就会出现字数问题。小单位的安排方式可能会有所改变。
然后,如果你关心FP格式的变化,你必须要知道IEEE 754没有描述FP表示(即使它只有一个图表建议一个),并且至少还有一个变体而不是与之相关的变体。 endianness:表示信号子正常的位在不同的实现中被不同地解释。