这是代码:
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
的,哪个是默认int
的1
。因此,您得到了隐式二进制转换的东西。
给编译器一个提示,表明您实际上希望将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
研究整数提升和通常的算术转换。