gpt4 book ai didi

c - 米斯拉-C :2012 warning of Rule 10. 8 "being cast to a wider type"

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:23 24 4
gpt4 key购买 nike

我收到规则 10.8 的 MISRA-C 警告:“基本无符号”类型 (unsigned char) 的复合表达式正在转换为更宽的无符号类型“unsigned short”。

此警告是使用以下代码检测到的。

void Fucntion(unsigned char isSwitchOn) {
unsigned short switchMask = 0U;

switchMask |= (unsigned short)(isSwitchOn & 1U) << 1;

为什么检测到警告?另外,这段代码会导致问题吗?

我认为将表达式(isSwitchOn & 1U)转换为int类型进行计算,并将结果截断并存储为unsigned short类型。这么想,这个警告对我来说似乎很不自然。

最佳答案

Why was a warning detected?

让我们看看

void Fucntion(unsigned char isSwitchOn) {
unsigned short switchMask = 0U;
switchMask |= (unsigned short)(isSwitchOn & 1U) << 1;
  1. isSwitchOn , 排名低于 1U , 通过通常的算术转换 (C11 §6.5.10 3) 到类型 unsigned匹配 1U 的类型.

  2. isSwitchOn & 1U计算,结果类型为unsigned .

  3. (unsigned short)适用于 unsigned结果——这一步看起来很奇怪。 这是规则 10.8 的 MISRA-C 警告。不需要类型转换。 复合类型 unsigned不必要地缩小到 unsigned short .

  4. (unsigned short)结果准备好进行移位,并且对 << 的每个操作数执行整数提升 .所以 (unsigned short)被提升为int或者可能 unsigned如果USHRT_MAX > INT_MAX .让我们假设 int .

  5. 现在转移一个int发生。结果是类型 int .

  6. int应用于 unsigned short .


Also, does this code cause problems?

在这种情况下,我没有看到,导致问题的 Actor 不是WET。编程。如果结果是 unsigned switchMask , 是的,那么移出的位就会丢失。

在移位后转换结果更有意义。 @Myst

switchMask |= (unsigned short)((isSwitchOn & 1U) << 1);

或者用

避免其他潜在的警告
switchMask = (unsigned short)(switchMask | ((isSwitchOn & 1U) << 1));

I think that the expression (isSwitchOn & 1U) is converted to an int type and calculated

不,表达式(unsigned short)(isSwitchOn & 1U)转换为int类型进行计算。


注意:unsigned char isSwitchOn 值得怀疑和 unsigned short switchMask不是同一类型。

关于c - 米斯拉-C :2012 warning of Rule 10. 8 "being cast to a wider type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47491192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com