double 的二进制表示

#include <cstdio>

void showBits(void* ptr, size_t size) {
    for (int i = size-1; i >= 0; --i) {
        unsigned char* byte = (unsigned char*)ptr + i;
        for (int j = 7; j >= 0; j--) {
            printf("%d", (*byte >> j) & 1);
        }
        printf(" ");
    }
    printf("\n");
}

int main() {
    int a = 257;
    int size = 4;
    showBits(&a, size);
    double b = 1.0;
    size = 8;
    showBits(&b, size);
    b = 0.0;
    size = 8;
    showBits(&b, size);
    b = 1.5;
    size = 8;
    showBits(&b, size);
    return 0;
}
00000000 00000000 00000001 00000001
00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00111111 11111000 00000000 00000000 00000000 00000000 00000000 00000000

按照IEEE 754标准,一个双精度浮点数占用64位,这64位被划分为三个部分:

符号位(S):第1位(从左到右),表示数的正负。0表示正数,1表示负数。

指数位(E):接下来的11位,用于表示指数部分。是补码表示的。

尾数位(M)/分数部分(Fraction):剩下的52位,表示有效数字的小数部分。在IEEE 754中,实际的有效数字是1.F(其中F代表这52位),即默认有一个隐含的前导1。

文章目录