직장에서 버그 없는 소프트웨어에 대한 최근 대화는 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.
절차 자체는 다음과 같습니다(웹 소스에서 가져온 코드).
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이 어떤 의미를 갖는지 이해할 수 없었습니다. 문서에는 오버플로가 언급되어 있지만 "10의 거듭제곱"이 아닌 "2의 거듭제곱" 경계에서 오버플로가 발생할 것으로 예상됩니다.
이 숫자의 설명이나 의미는 무엇입니까? 이것은 컴파일러입니까, 아니면 언어 표준의 문제입니까?