我正在编写一个程序来检查 double / float 的符号,首先我将数字的指针转换为一个 long int,然后我检查符号位是 0 还是 1。我不理解为什么使用此操作打印符号位 *pointer >> 63 是 -1 而不是 1?(假设 *pointer 是我将 double/float 转换成的 int64_t)
这是完整的代码:
double d = -0.0;
int64_t *pointer = (int64_t *) &d;
if (*pointer >> 63)
printf("negative number\n");
else
printf("positive number\n");
// if i print the result of (*pointer >> 63), it gives me -1
// so how can this go inside my if condition?
顺便说一下,64 位二进制打印 -0.0 给了我 100000000...000
由于浮点类型中存在带符号的零,并且可能存在 1 的补码整数类型,因此很难做到完全通用。
除了 (int64_t*)&d
的未定义性之外(您可以使用 union
双关语来解决),该方法将返回错误的 -0.0
符号。 .
幸运的是你可以使用 signbit()
来自 math.h
可能以不可移植的方式实现该功能。
我是一名优秀的程序员,十分优秀!