В настоящее время я имею дело с некоторыми проблемами MISRA и поэтому пытаюсь понять правила целочисленного преобразования в C.
Я получаю нарушение MISRA- C 2004 rule 12.9 Унарный оператор минус не должен применяться к выражению, базовый тип которого без знака
в строке кода
signed long int test = -1;
Я понимаю, что нет отрицательной целочисленной константы "-1 ", а унарный минус применяется к целочисленной константе" 1 "(как указано в https://en.cppreference.com/w/c/language/integer_constant).
Однако целочисленная константа" 1 "относится к первому типу в list int , long int , long без знака int (до C99) , long long int (с C99)
Я работаю с Keil (ARM 32 бита) и установленным флагом --c99, в то время как MISRA- C 2004, похоже, основан на стандарте C90.
Так что, похоже, мой инструмент SCA предполагая, что константа "1" имеет тип unsigned long int (до C99) , но я не могу понять, почему она не будет оно в обычном int и, следовательно, должно быть подписано.
Чтобы удовлетворить инструмент SCA, необходимо кодировать
signed long int test = -1L;
или
signed long int test = -((signed long int) 1);
Это правильное поведение или я что-то здесь упускаю?