我目前正在处理一些 MISRA 问题,因此试图了解 C 中的整数转换规则。
我违反了 MISRA-C 2004 规则 12.9 一元减运算符不得应用于基础类型为无符号的表达式
在代码行中
signed long int test = -1;
Run Code Online (Sandbox Code Playgroud)
我知道没有负整数常量“-1”,而是应用于整数常量“1”的一元减号(如https://en.cppreference.com/w/c/language/integer_constant 中所述)。
然而整数常量 "1" 是列表中的第一种类型int , long int , unsigned long int (until C99) , long long int (since C99)
我正在遵守 Keil(ARM 32 位)和 --c99 标志集,而 MISRA-C 2004 似乎基于 C90 标准。
所以看起来我的 SCA 工具假设 "1" 常量是unsigned long int (until C99) 类型,但我看不出,为什么它不适合普通int并因此被签名。
为了满足 SCA 工具,必须编写代码
signed long int test = -1L;
Run Code Online (Sandbox Code Playgroud)
或者
signed long int test …Run Code Online (Sandbox Code Playgroud)