【发布时间】:2021-11-06 09:51:24
【问题描述】:
编译如下代码
// foo.c
typedef unsigned char uint8_t;
int main() {
uint8_t a = 1;
uint8_t b = 10;
uint8_t c = 12;
uint8_t k = a + b + c;
}
通过以下完整命令使用 GCC 11.2(以及其他 GCC 版本):
gcc -Wconversion foo.c
导致以下警告:
Output of x86-64 gcc 11.2 (Compiler #3)
<source>: In function 'main':
<source>:11:17: warning: conversion from 'int' to 'uint8_t' {aka 'unsigned char'} may change value [-Wconversion]
11 | uint8_t k = a + b + c;
| ^
Compiler returned: 0
例如,添加两个无符号字符(即a + b)时不会发生这种情况。
在超过三个无符号字符之间使用算术运算的任意组合时会发生这种情况。
并且在 clang 版本 12.0.1 中不会发生这种情况。
为什么a + b + c 会导致int 在分配给k 之前必须转换为uint8_t 以抑制警告?
【问题讨论】:
-
或许有帮助:Implicit conversions
-
猜测:对于三个项,
a + b的结果类型为int,因此第二个+是int + uint8_t形式的表达式。也许编译器总是警告int + uint8_t,但从不警告uint8_t + uint8_t。 -
FWIW,gcc bugzilla 发现了 90 多个提到
-Wconversion的活动错误。警告购买者。 -
Tortellini Teusday,可以使用
uint8_t k = ( uint8_t) (a + b + c);来消除此类警告。 -
@chux-ReinstateMonica 是的,我知道这是一种方法,这在问题的最后一句话中有所说明。问题更多是关于为什么这会触发警告而
a+b例如不会
标签: c gcc gcc-warning