我使用的静态分析工具对这段代码提出了警告:
uint16 var1 = 1U;
uint16 var2 = ~var1;
我查看了MISRA C 2004的规则,发现了10.5条规定:
如果按位运算符~和<<应用于底层类型为unsigned char或unsigned short的操作数,则结果应立即转换为操作数的底层类型。
好的,这不是问题,隐式转换会被应用(我认为“转换”指的是隐式或显式转换)。但是10.1条规则说:
整数类型的表达式的值,在表达式比较复杂时不得隐式转换为不同的底层类型。
之前的一个复杂操作的例子是:~u16a
我修改了我的代码:
uint16 var1 = 1U;
uint16 var2 = (uint16) ~var1;
我收到了另一个警告:我认为将负值的int转换为unsigned int值不安全。我查看了C99标准(ISO C99)§6.3.1.3,但我不明白int与unsigned short的转换是否已经明确定义。
在EmbeddedGurus 文章中我读到:
c = (unsigned int) a; /* Since a is positive, this cast is safe */
我的问题:
- signed int 转换为 unsigned short 是否存在未定义行为?
- 如果存在,如何在安全的方式下使用补码运算符与 unsigned short?