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)
除了这个丑陋之外,我还在不断地说服铸造通常是不好的做法.
我的问题:
-Wconversion
并让编译器为我进行隐式转换,我会失去什么吗?编译器向您显示潜在的问题点,您应该考虑更改,但不要通过强制转换。您的代码中的问题是,在 C 中,永远不会对小于 的类型进行算术:编译器始终对它们int
执行隐式转换。int
因此,您的代码有效地将窄无符号类型转换为int
,执行操作,然后将它们转换回无符号类型。
一般来说,用窄类型进行算术并不是一个好主意。仅当存储大小有问题时才使用它们(通常是较大的结构,例如数组)。对于本地变量,或多或少是临时变量,这些狭窄的类型没有意义。