Идея в том, что в double 64 бита. Так что если мы воспользуемся type punning и наложим сверху дабла uint64_t, в котором тоже 64 бита, мы получим 64 битное целое число, содержащее в себе биты исходного дабла.
*reinterpret_cast(&a)
Далее, мы используем стандартный трюк с std::bitset для перевода числа в строку, содержащую его двоичное представление
И потом пара полезных фактов:
- мы выводим число и его же, но со знаком минус. Можно видеть, что знак хранится в первом бите.
- аналогично, можем посмотреть, в каких битах хранится экспонента, посмотрев на a, 2*a, 4*a
#include <iostream>
#include <bitset>
using namespace std;
void printBits(const double a)
{
cout << bitset<64>(*reinterpret_cast<const uint64_t*>(&a)) << endl;
}
int main()
{
const double a = 3.14;
printBits(a);
printBits(-a);
printBits(a*2);
printBits(a*4);
return 0;
}
0100000000001001000111101011100001010001111010111000010100011111
1100000000001001000111101011100001010001111010111000010100011111
0100000000011001000111101011100001010001111010111000010100011111
0100000000101001000111101011100001010001111010111000010100011111
Ideone