Для следующей программы:
int main(void)
{
int value = 2;
int result = value >> 1U;
return result;
}
... Splint 3.1.2 выдает предупреждение:
splint_test.c: (in function main)
splint_test.c:4:18: Variable result initialized to type unsigned int, expects
int: value >> 1U
To ignore signs in type comparisons use +ignoresigns
Кажется, что Splint является выражением, в котором целое число со знаком равносдвиг вправо имеет тип целого числа без знака.Однако все, что я могу найти в стандарте ANSI C90, это:
Результат E1 >> E2
равен E1
смещенным вправо E2
битовым позициям.Если E1
имеет тип без знака или если E1
имеет тип со знаком и неотрицательное значение, значение результата является неотъемлемой частью отношения E1
, деленного на величину 2, возведенную в степень E2
.
Основной целью этого кода является встроенная система с компилятором в основном C90.Тем не менее, я заинтересован в написании кода, соответствующего стандартам.Я тестировал GCC и Clang в режиме C99, поэтому restrict
работает.
Мои вопросы:
- Делает ли стандарт C какие-либо утверждения о типе результатасдвига битов?
- Есть ли компиляторы?
- Если нет, почему Splint может выдавать это предупреждение?