回 帖 发 新 帖 刷新版面

主题:探究浮点格式

//《c++编程思想(第一卷)》中有一道例题
//float和double里的数字位被分为段:指数、位数和符号位,它用科学
//计数法来存储数值。下面的程序打印出不同浮点数的二进制形式。
#include <iostream>
#include <cstdlib>
using namespace std;
void printBinary(const unsigned char val){
    for(int i=7;i>=0;i--)
        if(val&(1<<i))
            cout<<"1";
        else
            cout<<"0";
}
int main(int argc,char*argv[])
{
    if(argc!=2){
        cout<<"Must provide a number"<<endl;
        exit(1);
    }
    double d=atof(argv[1]);
    unsigned char*cp=reinterpret_cast<unsigned char*>(&d);
    for(int i=sizeof(double);i>0;i-=2){//[color=FF0000]为什么是i>0而不是i>=0[/color]
        printBinary(cp[i-1]);
        printBinary(cp[i]);//[color=FF0000]i不越界吗?为什么不是cp[i-2]?[/color]
    }
    return 0;
}
//如果sizeof(double)==8,那么打印时的顺序我想应该是cp[7]cp[6]cp[5]
//cp[4]cp[3]cp[2]cp[1]cp[0],可上面打印顺序好像是cp[7]cp[8]cp[5]cp[6]
//cp[3]cp[4]cp[1]cp[2]。迷惑。。。。。。

回复列表 (共3个回复)

沙发

不知道你抄的有没有问题

板凳

放心,绝对没有问题

3 楼

如果按lz的i允许=0,那i-1就明显会有越界问题吧…………
至于为什么这么输出,建议lz去看看double格式的存储方式

我来回复

您尚未登录,请登录后再回复。点此登录或注册