Недавно я читал Google Protocol Buffers, который позволяет использовать в сообщениях различные типы значений в виде скалярных значений.
Согласно их документации, существует три типа целочисленных примитивов переменной длины - int32
, uint32
и sint32
. В своей документации они отмечают, что int32
"Неэффективно для кодирования отрицательных чисел", если ваше поле, скорее всего, имеет отрицательные значения, вместо этого используйте sint32
. " Но если у вас есть поле, у которого нет отрицательных чисел, я предполагаю, что uint32 будет лучшим типом для использования, чем int32
в любом случае (из-за дополнительного бита и снижения стоимости ЦП обработки отрицательных чисел).
Итак, когда int32
был бы хорошим скаляром для использования? Является ли документация подразумевающей, что она наиболее эффективна только тогда, когда вы редко получаете отрицательные числа? Или всегда предпочтительнее использовать sint32
и uint32
, в зависимости от содержимого поля?
(Эти же вопросы относятся и к 64-битным версиям этих скаляров: int64
, uint64
и sint64
, но я оставил их вне описания проблемы для удобства чтения.)