Таки я нашел ответ на свой вопрос - почему Вирт выпилил беззнаковые целые в "Краткой истории Modula и Lilith"
Тип CARDINAL
Как можно объяснить введение типа CARDINAL — типа натуральных чисел — в виде еще одного базового типа? Потребность эта возникла из желания представлять адреса как числовые типы.
Lilith была 16-разрядной машиной с памятью 216 слов, поэтому нельзя было позволить себе такую роскошь, как наличие бесполезного бита знака. На первых порах после ввода этого типа все выглядело благополучно, но затем возникло несколько проблем. Как, например, можно эффективно реализовать сравнение i < c? Вопрос это легко снять, если смешанные выражения запрещены.
Для целочисленной (знаковой) и натуральной (беззнаковой) арифметики требуются два разных набора инструкций. Даже если одна и та же инструкция может использоваться для сложения, все равно существует различие в определении переполнения. Для деления ситуация еще более проблематична. В математике частное q = x DIV y и остаток r = x MOD y определяются отношениями
x = q * y + r, 0 <= r < y
Целочисленное деление в противоположность вещественному асимметрично в отношении 0.
Например,
10 DIV 3 = 3 10 MOD 3 = 1
-10 DIV 3 = 4 -10 MOD 3 = 2
Большинство компьютеров, однако, предоставляет инструкции, которые неверны в отношении данного определения. Они трактуют целочисленное деление наподобие вещественного деления, симметричного относительно 0:
(-x) DIV y = -(x DIV y)
(-x) MOD y = -(x MOD y)
Если целочисленное деление реализуется корректно, то деление на число в степени двойки может быть реализовано более эффективно путем простых сдвигов. В случае неверных инструкций деления это невозможно:
x*2n = left(x,n)
x DIV 2n = right(x,n)
Следующие процессоры помимо прочего осуществляют целочисленное деление вопреки математическому определению: Motorola 680x0, Intel 80x86, Intel 80960, DEC VAX, IBM Power.
Хуже того, язык Ada возвел эту ошибку в ранг стандарта.
Дабы не вступать в противоречие с другими, мы решили принять неверную арифметику.
Оглядываясь назад, можно с уверенностью сказать, что это было, конечно, серьезной ошибкой.
Компилятор использовал инструкции сдвига для умножения и деления чисел в степенях двойки только в случае выражений типа CARDINAL.
В общем и целом введение типа CARDINAL объясняется необходимостью обработки 16-разрядных адресов. С точки зрения математиков (которые изобрели отрицательные числа ради алгебраической полноты) его следовало бы назвать шагом назад, так как он создавал новые сложности для программиста, которых до этого не было. Рассмотрим, к примеру, следующие операторы, выполняющие действие Q для x = N-1, ..., 1, 0:
x := N-1;
WHILE x >= 0 DO Q; x := x-1 END
Если "x" типа INTEGER, то программа корректна, но если "x" типа CARDINAL, то такая запись приводит к переполнению, которого можно избежать путем корректной альтернативной формулировки
x := N;
WHILE x > 0 DO x := x-1; Q END
Приход 6 лет спустя 32-разрядных компьютеров дал возможность забыть тип CARDINAL. Этот эпизод показал, насколько неадекватность аппаратуры может заставить разработчика языка идти по пути усложнений и компромиссов, если тот хочет в полной мере использовать доступные аппаратные возможности. Урок состоит еще и в том, что память размером 2n требует
целочисленной арифметики как минимум с (n+1) разрядом.