c - 如何修复由 -Wconversion 引起的错误?

标签 c gcc

我有一段假/示例代码:

#include <stdint.h>

uint8_t func(uint16_t val0, uint16_t val1, uint16_t val2)
{
    uint8_t r;
    val0 += 0x7F;
    val1 += (uint16_t)0x7F;
    val2 += 0x7FU;
    r = (uint8_t)((val0+val1+val2) >> 8);
    r <<= (uint8_t)(val2 & 0x3);
    return r;
}

这是我得到的错误:
$ gcc -Wall -Wextra -Wconversion -O0 module.c -c -o module.o 
module.c: In function 'func':
module.c:6:10: warning: conversion from 'int' to 'uint16_t' {aka 'short unsigned int'} may change value [-Wconversion]
    6 |  val0 += 0x7F;
      |          ^~~~
module.c:7:10: warning: conversion from 'int' to 'uint16_t' {aka 'short unsigned int'} may change value [-Wconversion]
    7 |  val1 += (uint16_t)0x7F;
      |          ^
module.c:8:10: warning: conversion from 'unsigned int' to 'uint16_t' {aka 'short unsigned int'} may change value [-Wconversion]
    8 |  val2 += 0x7FU;
      |          ^~~~~
module.c:10:8: warning: conversion from 'int' to 'uint8_t' {aka 'unsigned char'} may change value [-Wconversion]
   10 |  r <<= (uint8_t)(val2 & 0x3);
      |        ^

该示例显示了我尝试解决问题的一些方法(例如强制转换)

有什么建议吗?

编辑:

修改示例

最佳答案

这个问题说明了为什么-Wconversion太热心了,以至于在很大程度上是无用的。

在 C 中,没有小于 int 的算术.例如:

val0 += 0x7F;

被评估为好像
val0 = (int)val0 + 0x7F;

分配回 val0没有 Actor 然后触发 -Wconversion .从某种意义上说,这是一个合法的警告:+运算符不会溢出,但将结果分配回来可能会丢失部分结果,并且编译器会告诉您这一点(尽管很笨拙)。

如果您打算使用 -Wconversion ,您基本上不能使用小于- += 的复合赋值运算符(如 int )类型。您需要写出等效形式并使用强制转换来表明您打算进行有损转换。例如在这里你会写:
val0 = (uint16_t)(val0 + 0x7F);

我不认为这是非常好的风格,但一些编码标准/政策(我认为,MISRA)强制要求它。

关于c - 如何修复由 -Wconversion 引起的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59654423/

相关文章:

c - += 是什么意思?

c - 有没有办法获得有关整数提升的警告?

c++ - 使用 g++ 和 clang++ 对 condition_variable 进行虚假唤醒

gcc - GCC 内联汇编中的 C 数组?

gcc - 如何使用 SSE 指令集绝对 2 个 double 或 4 个 float ? (高达 SSE4)

c - 短 C 代码 : Confused strlen() function

c - C 中的运算符 &= 和 ~1U

凯撒密码缺陷

c++ - "-Wl,--no-undefined -Wl,--no-allow-shlib-undefined"链接错误

c - 如何在 C 中将 char 数组转换为变量 long?