可能重复:
Float to binary in C++
我有一个非常小的双变量,当我打印它时我得到-0。 (使用C ++)。 现在为了获得更好的精度,我尝试使用
cout.precision(18); \\i think 18 is the max precision i can get.
cout.setf(ios::fixed,ios::floatfield);
cout<<var;\\var is a double.
但它只写了-0.00000000000 ......
我希望看到var。
的确切二进制表示换句话说,我想看看在这个变量的堆栈存储器/寄存器中写入了什么二进制数。
答案 0 :(得分:5)
union myUnion {
double dValue;
uint64_t iValue;
};
myUnion myValue;
myValue.dValue=123.456;
cout << myValue.iValue;
<强>更新强>
上述版本适用于大多数用途,但它假定64位双打。此版本不做任何假设并生成二进制表示:
double someDouble=123.456;
unsigned char rawBytes[sizeof(double)];
memcpy(rawBytes,&someDouble,sizeof(double));
//The C++ standard does not guarantee 8-bit bytes
unsigned char startMask=1;
while (0!=static_cast<unsigned char>(startMask<<1)) {
startMask<<=1;
}
bool hasLeadBit=false; //set this to true if you want to see leading zeros
size_t byteIndex;
for (byteIndex=0;byteIndex<sizeof(double);++byteIndex) {
unsigned char bitMask=startMask;
while (0!=bitMask) {
if (0!=(bitMask&rawBytes[byteIndex])) {
std::cout<<"1";
hasLeadBit=true;
} else if (hasLeadBit) {
std::cout<<"0";
}
bitMask>>=1;
}
}
if (!hasLeadBit) {
std::cout<<"0";
}
答案 1 :(得分:5)
这种方式可以保证符合标准:
double d = -0.0;
uint64_t u;
memcpy(&u, &d, sizeof(d));
std::cout << std::hex << u;
答案 2 :(得分:1)
尝试:
printf("0x%08x\n", myFloat);
这应该适用于32位变量,以十六进制显示。我从来没有尝试过使用这种技术来查看64位变量,但我认为它是:
printf("%016llx\n", myDouble);
编辑:测试了64位版本,它肯定适用于Win32(我似乎记得在GCC上需要大写LL ..也许)
EDIT2:如果你真的想要二进制文件,你最好使用其中一个答案获得你的double的uint64_t版本,然后循环:
for ( int i = 63; i >= 0; i-- )
{
printf( "%d", (myUint64 >> i ) & 1 );
}