如何区分零和负零?

spo*_*zzi 0 c floating-point binary hex

我正在实现该printf()功能。几乎所有东西都可以正常工作,但是当称为时,我遇到了一个问题ft_printf("%f", -0.0)。我的程序输出0.0而不是-0.0。我不能使用任何库。

我检查负性的条件就是“ x <0”,这不包括我的问题。我发现了区分零和负零的有希望的解决方案。

这似乎可以解决我的问题:

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

我希望打印该程序,1但是在我的程序中,当它在输出的代码中执行时0。我有一个问题理解的部分是如何*((long *)&a)做到的:使一个数字可与十六进制对应的数字相提并论。

Joh*_*ger 7

C数学库(标准库的一部分)提供了一个signbit,它绝对是检查浮点数符号的最简单,最便捷的方法。如果您对避免使用库的要求意味着第三方库,那么它将满足您的目的。

例:

#include <math.h>
#include <stdio.h>

void putsign(double d) {
    if (signbit(d)) {
        putchar('-');
    } else {
        putchar('+');
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ jl2210:另一方面,`fputc`和朋友肯定需要`stdio.h`。而且,如果不使用`stdarg.h`来实现varargs函数(例如`printf`)是完全不可能的。因此,至少存在一部分标准库。OP说有“某些例外”;了解它们是有用的。 (3认同)
  • “ signbit”是一个*宏*,因此不应要求链接任何库。[演示](https://godbolt.org/z/h5Ri4B) (2认同)