小编no_*_*ame的帖子

应用按位运算符"〜"后,从"int"转换为"unsigned short"

我使用的静态分析工具会对此代码提出警告:

uint16 var1 = 1U;
uint16 var2 = ~var1;
Run Code Online (Sandbox Code Playgroud)

我检查了MISRA C 2004规则,我发现10.5规则:

如果按位运算符〜和<<应用于基础类型unsigned charunsigned short的操作数od ,则结果应立即转换为操作数的基础类型.

好吧,这不是问题,应用隐式强制转换(我认为"强制转换"意味着隐式或显式强制转换).但10.1规则说:

整数类型的表达式的值不应隐式转换为表达式复杂的不同基础类型.

先前的复杂操作示例是:~u16a

我将我的代码更改为:

uint16 var1 = 1U;
uint16 var2 = (uint16) ~var1;
Run Code Online (Sandbox Code Playgroud)

我得到另一个警告:我认为将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 */
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 是否有从signed intunsigned short unspecified行为的显式转换?
  2. 如果是,如何以安全的方式使用带有unsigned short的补码运算符?

c casting

12
推荐指数
2
解决办法
7948
查看次数

在C中使用带有位运算符的小整数

之前的问题相关,我无法理解MISRA C 2004的一些规则.

ISO C99 2007草案中,在6.5节§4中:

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

好吧,使用带位运算符的有符号整数可能会产生未定义的行为(并没有任何意义).

一个好的解决方案是使用显式转换为更宽的无符号整数类型,以便绕过整数提升,然后不使用带符号运算符的有符号值(请参阅我之前问题的相关答案).

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

c misra type-promotion

10
推荐指数
1
解决办法
1125
查看次数

标签 统计

c ×2

casting ×1

misra ×1

type-promotion ×1