我目前正在处理一些 MISRA 问题,因此试图了解 C 中的整数转换规则。
我违反了 MISRA-C 2004 规则 12.9 一元减号运算符不应应用于基础类型为无符号的表达式
在代码行中
signed long int test = -1;
我知道没有负整数常量“-1”,而是应用于整数常量“1”的一元减号(如https://en.cppreference.com/w/c/language/integer_constant中所述)。
然而,整数常量“1”是列表中的第一种类型int、long int、unsigned 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);
这是正确的行为还是我在这里遗漏了什么?