【发布时间】:2021-01-14 16:03:33
【问题描述】:
试图弄清楚这是如何工作的,但我无法理解我所代表的内容。 我知道我们分配了一个 unsigned long long,因为它包含的位数与 float 相同。但是 i 究竟代表什么?
我最好的解释是我们试图将 double 数转换为 unsigned long long int,因为它们具有相同的位数。看来最好的方法是取消引用我们设置的指针?
任何帮助将不胜感激!
void printDouble(double d) {
unsigned long long int i = *(unsigned long long int *)&d;
for (int j = 63; j >= 0; j--) {
std::cout << ((i >> j) & 1);
if (j == 63) std::cout << " ";
else if (j == 52) std::cout << " ";
}
}
【问题讨论】:
-
这是类型双关语,它是未定义的行为,就像它在这里完成的方式一样。
-
它的工作原理是违反 严格的别名规则,但暂时搁置一下。您循环了 64 次(
i中的每个位一个),然后右移j位并与1进行 AND 以隔离感兴趣的位并输出它。您检查j是63还是52并在符号位和偏置指数之间输出一个空格,然后在偏置指数和尾数之间再次输出。 -
代码是 UB,如前所述。它也可以作为
unsigned long long int &i = (unsigned long long int &)d;工作(同样是UB,但没有额外的副本并且可能更易于阅读)。 -
float是单精度类型,使用 32 位。double是使用 64 位的双精度类型。long long保证至少为 64 位。