
最近關於工作中無錯誤軟體的討論引發了關於 TeX 的討論(它被認為實際上是無錯誤的,儘管從技術上來說它可能是錯誤的)。由於 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 編譯器的上下文中具有什麼意義。該文件提到了溢出,但是我希望溢出發生在「二的冪」邊界上,而不是「十的冪」邊界上。
這個數字有何解釋或意義?這是編譯器還是語言標準的怪癖?