| Любопытная деталь: компилятор ББ считает число -9223372036854775808 в тексте программы ошибкой, хотя оно входит в диапазон LONGINT согласно Сообщению о языке. Вместо этого можно писать MIN(LONGINT) или -9223372036854775807 - 1.
 Связано с тем, что унарный минус расценивается как операция, за которой следует число; а 9223372036854775808 не входит в диапазон LONGINT, и поэтому выдается ошибка number too large.
 
 Поправить несложно:
 
 в DevCPS:
 (* global *)
 VAR unaryMinus*: BOOLEAN;
 (* в PROCEDURE Number после строчки *)
 ELSIF intval < 9223372036854775808.0E0 - realval THEN numtyp := int64	(* 2^63 *)
 (* добавить *)
 ELSIF unaryMinus & (intval = 9223372036854775808.0E0 - realval) THEN numtyp := int64
 (* и в конце *)
 IF unaryMinus THEN intval := -intval; realval := -realval END
 END Number;
 
 DevCPP:
 (* в PROCEDURE SimpleExpression *)
 IF sym = minus THEN DevCPS.unaryMinus := TRUE; DevCPS.Get(sym); DevCPS.unaryMinus := FALSE; Term(x);
 IF (x.class # Nconst) OR ~(x.typ.form IN {Int8, Int16, Int32, Int64, Real32, Real64}) THEN
 DevCPB.MOp(minus, x)
 END
 
 Но, может, и не стоит трогать 20-летний код ради такой мелочи.
 
 
 |