使用类型转换删除gcc编译器警告

bit*_*ack 9 c casting type-conversion compiler-warnings implicit-conversion

我正在使用gcc 4.9进行嵌入式ARM编程.我一直在使用-Wconversion交换机,因为它是我公司的默认开发工具配置.我正在使用stdint.h 类型(uint8_t,uint32_t等).

每次执行复合赋值或简单添加时,编译器都会创建警告.例如:

uint8_t u8 = 0;
uint16_t u16;

// These cause warnings:
u8 += 2;
u8 = u16 >> 8;
Run Code Online (Sandbox Code Playgroud)

修复此问题的"常用方法"是使用强制转换,如此此处所述:

u8 = (uint8_t)(u8 + 2);
u8 = (uint8_t)(u16 >> 8);
Run Code Online (Sandbox Code Playgroud)

除了这个丑陋之外,我还在不断地说服铸造通常是不好的做法.

我的问题:

  1. 为什么以这种方式使用类型转换是不好的?
  2. 通过简单地省略-Wconversion并让编译器为我进行隐式转换,我会失去什么吗?

Jen*_*edt 3

编译器向您显示潜在的问题点,您应该考虑更改,但不要通过强制转换。您的代码中的问题是,在 C 中,永远不会对小于 的类型进行算术:编译器始终对它们int执行隐式转换。int

因此,您的代码有效地将窄无符号类型转换为int,执行操作,然后将它们转换回无符号类型。

一般来说,用窄类型进行算术并不是一个好主意。仅当存储大小有问题时才使用它们(通常是较大的结构,例如数组)。对于本地变量,或多或少是临时变量,这些狭窄的类型没有意义。