10

与上一个问题有关,我无法理解 MISRA C 2004 的一些规则。

ISO C99 草案 2007中,第 6.5 节第 4 节:

某些运算符(一元运算符 ~ 和二元运算符 <<、>>、&、^ 和 |,统称为按位运算符)需要具有整数类型的操作数。这些运算符产生的值取决于整数的内部表示,并且具有符号类型的实现定义和未定义方面。

好的,使用带按位运算符的有符号整数会产生未定义的行为(并且没有意义)。

一个好的解决方案是使用显式转换为更广泛的无符号整数类型以绕过整数提升,然后不要将有符号值与位运算符一起使用(请参阅我上一个问题的相关答案)。

但在 MISRA C 2004 中,可以使用带有位运算符的小型无符号整数(例如规则 10.5)。为什么,如果积分提升导致使用按位运算符的有符号值?我想我不明白一些事情。

4

1 回答 1

1

规则不相互矛盾,你不需要扩大类型。您可以立即将小整数二进制运算的结果转换回其类型。

除非第一个操作数是 int,否则不会将小整数提升为 int 进行移位。

这是来自他们的例子:

uint8_t port = 0x5aU;
uint8_t result_8;
uint16_t result_16;

result_8 = (~port) >> 4;  /* not compliant */
result_8 = ((uint8_t)(~port)) >> 4; /* compliant */
result_16 = ((uint16_t)(~(uint16_t)port)) >> 4; /* compliant */
于 2014-10-07T15:15:14.873 回答