Для следующей программы:
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 может выдавать это предупреждение?
>>
так же, как и другие бинарные операторы? Это было бы ошибкой в Splint, и, поскольку текущая версия, похоже, такая же, как и в 2007 году, я не думаю, что с тех пор что-то изменилось. - person Roland Illig   schedule 14.04.2019