首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于浮点数的字节存储顺序解决办法

2012-03-09 
关于浮点数的字节存储顺序对于整形多字节变量在存储到二进制文件时存在一个字节顺序问题,不同体系结构下可

关于浮点数的字节存储顺序
对于整形多字节变量在存储到二进制文件时存在一个字节顺序问题,不同体系结构下可能存在little_endian   和big_endian的问题。为了提高通用性,我们可以强制定义一个存储方式,如就采用高前低后字节顺序存储。但是对于浮点数是否也存在   little_endian   和big_endian的问题呢?如果存在我们该如何强制定义一个顺序,进而在存储和读取时能够保证不会由于体系结构底层little_endian   和big_endian的不同而造成错误?

[解决办法]
我建议浮点数还是转成字符串,或一定精度的定点数传输。

因为不同的平台之间,对于浮点数,问题就不只是字节顺序了,每种CPU采用的是否都是IEEE的标准浮点格式本身就是个问题。比如尾数多少位,符号位多少位,阶数多少位,尾数用移码还是用补码,都不见得完全一致吧。
[解决办法]
// 输入4个字节的浮点数内存数据
void DecodeFloat( BYTE pByte[4] )
{
printf( "原始(十进制):%d? %d? %d? %d\n " , (int)pByte[0],
(int)pByte[1], (int)pByte[2], (int)pByte[3] );
printf( "翻转(十进制):%d? %d? %d? %d\n " , (int)pByte[3],
(int)pByte[2], (int)pByte[1], (int)pByte[0] );
bitset <32> bitAll( *(ULONG*)pByte );
string strBinary = bitAll.to_string <char, char_traits <char> , allocator <char> > ();
strBinary.insert( 9, "? " );
strBinary.insert( 1, "? " );
cout < < "二进制: " < < strBinary.c_str() < < endl;
cout < < "符号: " < < ( bitAll[31] ? "- " : "+ " ) < < endl;
bitset <32> bitTemp;
bitTemp = bitAll;
bitTemp < <= 1;
LONG ulExponent = 0;
for ( int i = 0; i < 8; i++ )
{
ulExponent |= ( bitTemp[ 31 - i ] < < ( 7 - i ) );
}
ulExponent -= 127;
cout < < "指数(十进制): " < < ulExponent < < endl;
bitTemp = bitAll;
bitTemp < <= 9;
float fMantissa = 1.0f;
for ( int i = 0; i < 23; i++ )
{
bool b = bitTemp[ 31 - i ];
fMantissa += ( (float)bitTemp[ 31 - i ] / (float)( 2 < < i ) );
}
cout < < "尾数(十进制): "? < < fMantissa < < endl;
float fPow;
if ( ulExponent > = 0 )
{
fPow = (float)( 2 < < ( ulExponent - 1 ) );
}
else
{
fPow = 1.0f / (float)( 2 < < ( -1 - ulExponent ) );
}
cout < < "运算结果: " < < fMantissa * fPow < < endl;
}


[解决办法]
但是对于浮点数是否也存在 little_endian 和big_endian的问题呢?
----------------------
存在


如果存在我们该如何强制定义一个顺序,进而在存储和读取时能够保证不会由于体系结构底层little_endian 和big_endian的不同而造成错误?
-------------------------
就按照类整数的处理方法不就行了,比如按你所说的 “我们可以强制定义一个存储方式,如就采用高前低后字节顺序存储”

反正data就是一堆二进制bit,只要解析方法相同就可以。至于steedhorse(晨星)所说的
"每种CPU采用的是否都是IEEE的标准浮点格式本身就是个问题 ",C标准也没有规定int就一定要
按补码实现。但这些都是现代计算机实现的基本假设。

所以,如果浮点按IEEE解析,就没有问题了~

热点排行