浮点数如何用补码来表示

heshang88 2009-07-29 09:54:04
问题:如何将X=2¹¹*(-0.1100101))(请注意,由于打印的原因2的幂次方上是11)
Y=2¹¹°*(+1.1010001)(请注意,由于打印的原因2的幂次方上是110)

如何将它用X,Y分别用补码来表示出来。

书上的答案是这样的:
[X]的补码=00,0011;11,0011011
[Y]的补码=00,0110;00,1000001

我没有搞懂,它们是怎样得出来的啊,请高手帮助
...全文
3308 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
heshang88 2009-08-03
  • 打赏
  • 举报
回复
好的,谢谢
gemini_star 2009-07-31
  • 打赏
  • 举报
回复
补码是指整数的表示方式,浮点数的一般表示方式是IEEE的标准 1位符号+8位指数(移127)+23位位数
你的X是负数,所以符号位是1。 尾数0.1100101左移一位变成1.10010100000000000000000 同时指数减去1变成9,移码为9+127=136=(10001000)2

所以IEEE的标准浮点数表示为11000100010010100000000000000000 我不知道你的答案是哪里来的。IEEE的单精度浮点格式是32位的。大概是你的教科书上自己定义了一个格式吧
fireseed 2009-07-30
  • 打赏
  • 举报
回复
以前写的一个分析浮点数的代码,仅供参考


float fTest = 54345.3435f;
unsigned char *pData = (unsigned char*)&fTest;
float fRes = 1.0f; // 表示1.xxx
// 提取尾数
for ( unsigned int i = 0; i < 23; ++i )
{
// 确定尾数所在的字节,并计算当前的位在字节中的位置
unsigned char nBit = pData[ 2 - ( i + 1 ) / 8 ] << ( i + 1 ) % 8;
nBit >>= 7;
fRes += (float)nBit / ( 2 << i ); // 2<<i相当于2^i
}
// 提取阶码,阶码位于第30位到第23位
unsigned char nExp = pData[3];
nExp <<= 1; // 除掉附号位
nExp |= ( pData[2] >> 7 ); // 与下个字节的首位合并,组成阶码
nExp -= 0x7F; // 减127得到原阶数
fRes *= pow( 2.0f, (float)*(char*)&nExp );
// 提取符号位,位于最高位,第31位
if ( pData[3] & 0x80 )
{ // 最高位为1则为负,为0则为正
fRes = -fRes;
}
cout << setprecision(10) << fTest << "->" << fRes;

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧