Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Даже в классической книге Кернигана/Ритчи множество примеров, где счетчики, индексы и прочие имеют знаковый тип.
Обе мейнстримовых модели целых, знаковые и беззнаковые, плохо подходят для счётчиков/индексов.
Тут должен быть тип с семантикой как у указателей — отдельный тип для значения, отдельный тип для разницы.
(собсно, указатели — это и есть индекс в участке памяти)
Значение индекса будет беззнаковым, разница знаковая.
Значения индексов можно сравнивать/вычитать, нельзя складывать.
К индексам можно прибавлять смещение и т.д. — всё как у указателей.
Соответственно, при итерировании от индекса до индекса будет логика как при итерировании по указателям.
При итерировании от одного указателя в какую-либо сторону на нужное смещение — цикл оперирует знаковым смещением до тех пор, пока смещение не будет равно 0-лю (или другому смещению).
С подобной проблематикой сталкивался при нумерации сообщений в сетевом протоколе.
Номера сообщений по стандарту беззнаковые, но разница их знаковая.
В итоге, или необходимо во внутренней логике обкладываться if-ами, или использовать числа удвоенной ширины в памяти/алгоритмах, или нарисовать свои обертки над целыми с соотв. операциями — самый правильный вариант, ИМХО.