Причина в том, что наиболее подходящим типом для счетчика этого типа является регулярное signed
целое число, даже если этот счетчик никогда не станет ниже 0.
Почему счетчик должен быть unsigned
? Тот факт, что он не может стать отрицательным, вовсе не является оправданием для данного текущего реального значения из unsigned
для языка.
unsigned
для C ++ не означает «целое число, которое не может быть отрицательным». Чтобы понять, почему это определение просто не имеет смысла, рассмотрим, что
unsigned
составляет unsigned
unsigned
с signed
unsigned
unsigned
никогда не превышает -1 Ничто из вышеперечисленного не имеет никакого смысла, если считать unsigned
значением «неотрицательный» ».
Использование unsigned
для size_t
было ошибкой (см., Например, Почему size_t без знака? ), только частично * может быть исключено, потому что в 16-битной эпохе один дополнительный бит считался неправильным семантика, которую типы unsigned
имеют в C ++ для такого рода использования.
К сожалению, теперь ошибка size_t
не может быть исправлена (из-за обратной совместимости), но зачем повторять ту же ошибку в другой не связанной области?
Обратите внимание, что, вероятно, большая ошибка была сделана просто из-за выбора имя unsigned
(учитывая его реальное значение). Если бы этот тип был назван (более подходящим образом) modulo
, то, вероятно, было бы более очевидно, почему использование modulo int
для размера строки не имеет никакого смысла вообще.
Имя не имеет значения, то, что оно считает, является семантическим, и unsigned
просто имеет неправильную семантику для счетчика или размера.
(*) Лично я не думаю, что это было достаточно веской причиной даже тогда. Если 32767 не достаточно для размера сейчас, то 65535 не будет достаточно скоро. По моему мнению, только один бит (удвоенное значение) не был приемлемой ценой для такого изгиба семантики.
Я опубликовал видео , в котором более подробно обсуждаю, почему я считаю, что использование типа unsigned для size_t
было ошибкой проектирования в C ++.
Слайды можно загрузить с http://raksy.dyndns.org/unsigned.pdf
Вы не сказали, на какой платформе вы находитесь, но вот одна в Microsoft .Net:
http://jclement.ca/devel/dotnet/reallysimplelicensing.html
Эта страница документирует очень простой схема лицензирования, которую можно использовать с ваше приложение .NET. Это предназначено быть достаточно безопасным, простым в реализации и легко расширяется. Образец версии позволяет предоставлять файлы лицензий с вложенным в них именем клиента но вы можете легко расширить его, добавив другая идентифицирующая информация, машина привязки, даты истечения срока действия и т. д.
В этой схеме используются Библиотека RSA и подпись XML. В принципе вы помещаете все, что хотите, в XML Документируйте и подпишите этот документ. затем вы можете предоставить этот файл своему клиент и приложение могут читать информация о лицензии из этого файл. Поскольку файл в цифровом виде подписанный файл лицензии НЕ может быть вмешиваться, если вы не отпустите закрытый ключ (который вы действительно не следует делать).