我正在K&R(第二版)中学习C,并且对本书的早期示例之一感到困惑。在第1.5.2节中,该书首先展示了一个字符计数程序,如下所示:
#include/* count characters in input; 1st version */ main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); }
然后备注:
可能有可能通过使用
double
并展示此程序的替代版本:
#include/* count characters in input; 2nd version */ main() { double nc; for (nc = 0; getchar() != EOF; ++nc) ; printf("%.0f\n", nc); }
在double
这里使用a 有意义吗?似乎没有;a long long
肯定会更好,因为它可以在同一空间中存储比双罐更大的整数(不损失精度),并通过在声明时传达该变量是整数来提高可读性。
是否存在使用double
我遗失的a的合理性,还是K&R示例只是为了说明double
类型而臭名昭著的普通错误代码?
double
与 long
在精度损失不可接受的情况下,有任何合理的理由使用双精度来存储整数吗?[...]在这里使用double有意义吗?
即使在C2011,类型long
可以具有少至31值的位,因此其范围表示的值的可以是小到从-2 31 2 31 - 1(假设二的补码表示;稍窄用符号/幅值表示)。
C没有指定浮点值表示的详细信息,但如今IEEE-754表示已接近普遍。C double
几乎总是以IEEE-754二进制双精度格式表示,该格式提供53位尾数。该格式可以精确表示-(2 53-1)到2 53-1的所有整数,并且如果按照IEEE规范执行并且数学结果和所有中间值都可以精确表示,则将完全执行涉及这些数字的算术运算整数(有时甚至不是)。
因此,使用double
代替long
确实可以在不牺牲精度的情况下产生更大的数值范围。
double
与 long long
肯定
long long
会更好[...]
long long
具有较大的范围(精确地)比表示的整数值double
,因此,没有理由偏爱double
超过long long
对整数如果后者是可用的。但是,正如在评论中所观察到的那样,long long
在K&R的第一版于1978年发行时就不存在,甚至在1988年第二版发行时,它也远远没有达到标准。因此,long long
Kernighan和Ritchie不在考虑其他选择。确实,尽管许多C90编译器最终都支持它作为扩展,long long
但直到C99才被标准化。
无论如何,我倾向于认为让您感到困惑的话并不是double
为了达到目的而使用该字眼,而是作为对的比较范围的补充说明double
。