最近关于工作中无 bug 软件的讨论引发了关于 TeX 的讨论(它被认为几乎无 bug,但从技术上讲这可能是错误的)。由于 TeX 的源代码在“TeX:程序”,我们查看了一下,并挑选了一个乍一看不太清楚的程序。它是 的实现print_int
,位于该书第 28 页的 §65。其文档说明:
@ The following procedure, which prints out the decimal representation of a given integer |n|, has been written carefully so that it works properly if |n=0| or if |(-n)| would cause overflow. It does not apply |mod| or |div| to negative arguments, since such operations are not implemented consistently by all \PASCAL\ compilers.
该过程本身如下所示(代码取自 WEB 源):
procedure print_int(@!n:integer); {prints an integer in decimal form}
var k:0..23; {index to current digit; we assume that $|n|<10^{23}$}
@!m:integer; {used to negate |n| in possibly dangerous cases}
begin k:=0;
if n<0 then
begin print_char("-");
if n>-100000000 then negate(n)
else begin m:=-1-n; n:=m div 10; m:=(m mod 10)+1; k:=1;
if m<10 then dig[0]:=m
else begin dig[0]:=0; incr(n);
end;
end;
end;
repeat dig[k]:=n mod 10; n:=n div 10; incr(k);
until n=0;
print_the_digs(k);
end;
虽然算法本身很容易理解(毕竟,它只是打印一个数字),但我们无法理解 100000000 这个数字在当时的 Pascal 编译器中具有什么意义。文档中提到了溢出,但我预计溢出发生在“2 的幂”边界上,而不是“10 的幂”边界上。
这个数字的解释或意义是什么?这是编译器还是语言标准的怪癖?