В приведенном вами примере каждое число преобразуется в unsigned int
из-за распространения unsigned
из-за обычных правил арифметического преобразования;поэтому явно указывать, что 23 является беззнаковым, не нужно и, возможно, уродливее.
Суффикс 'u' к целым числам используется редко.Есть две причины, по которым я могу использовать его.
1) Если вы выполняете несколько операций только с константами, иногда явное поведение без знака является именно тем, что вам нужно.Возьмем, к примеру, unsigned int x = 524289 * 4096;
Если предположить, что 32-битные целочисленные значения вычислимы переполнят подписанную версию, что является неопределенным поведением, но если мы изменим ее таким образом unsigned int x = 524289u * 4096u;
, она будет отлично вписываться в unsigned int
.Его поведение также всегда определяется.Мы могли бы просто привести одно из значений, но я бы сказал, что это понятнее.
2) Одним словом: предупреждения.Обычное предупреждение компилятора и линтера жалуется всякий раз, когда происходит сравнение между целыми числами со знаком и без знака, заставляя
unsigned x = 3;
/* Do stuff */
if (x > 2) // Comparison of signed and unsigned integers
{
/* Do something */
}
вызывать предупреждение, которое может вызвать неудачную компиляцию в зависимости от того, насколько анальными являются требования к сборке.Также могут быть предупреждения для выполнения побитовых операций со знаковыми целыми числами, так что ваш линтер может жаловаться на это:
int roundup16 (int x)
{
return ((x - 1) | 0xf) + 1;
}
, который возвращает x, округленное до следующего кратного 16.