Ответ 1
Целочисленные литералы, такие как 1
в C-коде, всегда имеют тип int
. int
- это то же самое, что и signed int
. Один из них добавляет u
или U
(эквивалент) к литералу, чтобы гарантировать, что он имеет тип unsigned int, чтобы предотвратить различные неожиданные ошибки и странное поведение.
Один из примеров такой ошибки:
На 16-битной машине, где int равно 16 битам, это выражение приведет к отрицательному значению:
long x = 30000 + 30000;
Оба 30000 литералов имеют тип int, и поскольку оба операнда имеют тип int, результатом будет int. 16-разрядное целое число со знаком может содержать значения только до 32767, поэтому оно будет переполнено. Из-за этого x
получит странное отрицательное значение, а не 60000, как ожидалось.
Код
long x = 30000u + 30000u;
однако, будет вести себя как ожидалось.