В качестве приблизительного правила я использовал беззнаковые целые для подсчета вещей и подписанные целые для измерения.
Если вы обнаружите, что вы уменьшаете или вычитаете из целого числа без знака, то вы должны оказаться в контексте, в котором вы уже ожидаете, что будете очень осторожны, чтобы не потерять (например, потому что вы в каком-то низкоуровневом коде отступаете с конца строки, поэтому, конечно, вы сначала убедитесь, что строка достаточно длинная, чтобы это поддерживать). Если вы не находитесь в таком контексте, где абсолютно важно, чтобы вы не опускались ниже нуля, тогда вам следовало использовать значение со знаком.
В моем использовании целые числа без знака предназначены для значений, которые абсолютно не могут стать отрицательными (или для той, что в миллионной ситуации, когда вы на самом деле хотите арифметику по модулю 2 ^ N), а не для значений, которые просто так не оказываются отрицательными, в текущая реализация, вероятно.