如何解决此棉绒警告"Implicit binary conversion from int to unsigned int"



这是代码:

test.cpp
unsigned short x;
bool y;
if ((x==1)&& y)
{
  ...
}
else
{
  ...
}

我收到一条棉绒消息:

Note 912 Implicit binary conversion from int
to unsigned int [MISRA Rule 48]

为什么?以及如何避免这种情况?

您正在比较x哪个是unsigned short的,哪个是默认int1。因此,您得到了隐式二进制转换的东西。

给编译器一个提示,表明您实际上希望将x与另一个unsigned值进行比较:

if ((x==1U) && y)

试试这个

if ( ( static_cast<unsigned int>(1) == x ) && y)

因为 1 被视为 int。

unsigned int x 

或演员表

目前尚不清楚您使用的是哪个版本的 MISRA。在编写C++代码时,您应该使用 MISRA-C++,其他一切都将违反 MISRA 规则。显然,MISRA-C检查器无法检查对MISRA-C++的遵守情况。

无论如何,假设您有一个具有 32 位整数的系统,无论 MISRA 版本如何,这都应该解决问题:

if ( ( static_cast<uint32_t>(x) == 1u ) && y)   // compliant

要了解的重要部分是隐式促销的工作原理以及如何避免它们:

  • 1文字转换为unsigned short不会解决任何问题。这样的强制转换是完全多余的,因为无论如何,操作数都会立即整数提升回int

    if ( ( x == static_cast<unsigned short>(1) ) && y) // not compliant

    unsigned short ushort=1u; if ( ( x == ushort ) && y) // not compliant

  • 1文字转换为unsigned int或仅将其追逐到1u(相同的事情(将使程序按预期运行,但它不会解决 MISRA 警告。因为您仍然具有x操作数的隐式类型提升,即 MISRA 冲突。

    if ( ( x == 1u ) && y) // not compliant

    if ( ( static_cast<unsigned int>(1) == x ) && y) // not compliant

研究整数提升通常的算术转换

最新更新