我正在实现printf()函数。几乎所有的东西都能正常工作,但是当被称为ft_printf("%f", -0.0)时,我有一个问题。我的程序输出0.0而不是-0.0。我不能用任何图书馆。
我检查消极性的条件只是“xDistinguish zero and negative zero中找到了一个有前途的解决方案。
这似乎能解决我的问题:

double a = -0.0;
printf("%d\n", (*((long *)&a) == 0x8000000000000000));

我想让这个程序打印1,但在我的程序中,当我在代码中打印时,它会输出0。我有一个问题,那就是:*((long *)&a)如何使一个数字与它的十六进制对应数相比较。

最佳答案

这类似于我完成的暗战卡塔。诀窍是用要检查的数字除以负零,如下所示:

int isPositiveZero(double a) {
    return 1/a == 1/0.0;
}

如果-infinity为负零,除法给出a,如果infinity为零,除法给出a
如果你想按自己的方式做,请尝试以下操作:
(*((long *)&a) & 0x8000000000000000)

注意,这违反了严格的别名规则,这会导致未定义的行为。这意味着你的程序可以做任何事情,从打印正确的结果到让你的计算机长出翅膀飞走。
如果您有可用的math.h并且不反对使用标准C库中的宏,那么这个解决方案(使用signbit)也将起作用(并且更具可移植性):
#include <math.h>

int isPositiveZero(double a) {
    return a == 0.0 && !signbit(a);
}

09-08 00:27