Не обманывайте себя по имени: unsigned часто неправильно понимают как неотрицательный, но правила для языка отличаются ... вероятно, лучшим именем было бы "bitmask" или "modulo_integer".
Если вы думаете, что unsigned неотрицателен, то, например, правила неявного преобразования являются полной бессмыслицей (почему разница между двумя неотрицательными должна быть неотрицательной? Почему сложение неотрицательных и целых чисел должно бытьнеотрицательно?).
Очень жаль, что стандартная библиотека C ++ сама попала в это недоразумение, потому что, например, vector.size () является неподписанным (абсурдно, если вы имеете это в виду, как сам язык в терминах битовой маски илиmodulo_integer).Этот выбор размеров больше связан со старыми 16-битными временами, чем с unsigned-ness, и, на мой взгляд, это был ужасный выбор, который мы все еще платим за ошибки.