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。