Для следующей программы:
int main(void)
{
int value = 2;
int result = value >> 1U;
return result;
}
... Шина 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 может выдавать это предупреждение?