c - 为什么 >>24 会导致 -Wconversion 但 >>23 不会?

标签 c gcc compiler-warnings implicit-conversion

代码如下:

#include <stdint.h>

unsigned char f(uint32_t RGBA)
{
  return (RGBA>>24) & 0xFF;
}

当使用 -Wconversion 编译时,它会导致“警告:从‘uint32_t {aka unsigned int}’转换为‘unsigned char’可能会改变其值 [-Wconversion]”。如果我将偏移值降低到 23 或更小,警告就会消失。

我查看了 C99 标准,但我不明白这里发生了什么。如果我删除 & 运算符,则始终会发出警告,这可能很好,因为表达式的结果(整数提升后)大于 unsigned char。我唯一的想法是,仅因为 gcc 很聪明并且看到结果无论如何都是 8 位的,所以对于较小的类次省略了警告,因为标准并未将其作为特例。我在这儿吗?

为什么偏移值很重要?那是 GCC 错误吗? Clang 似乎不会对任何移位值产生警告。

我在 64 位 Linux 系统上使用 GCC 5.3.1。

最佳答案

正如 Shafik Yaghmour 所提到的,这似乎是 GCC 中的一个错误:

GCC Bug 40752: -Wconversion generates false warnings for operands not larger than target type

它似乎从 4.4.0 版开始就存在,首次报​​告于 2009 年 7 月 14 日,并且有 5 个重复项。根据错误报告中的评论,似乎有一些关于如何处理它的争论。

关于c - 为什么 >>24 会导致 -Wconversion 但 >>23 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34775374/

相关文章:

在 strcpy 上崩溃,不知道为什么?

c++ - 我怎样才能让 g++ 打印关于函数参数类型转换的警告?

C:多维数组实现不起作用,给出不同的值

C: 在 <complex.h> 中声明类型

C: printf char* 返回奇怪的最后一个字符

c - 错误: 'for' loop initial declarations are only allowed in c99 mode

c++ - 自动跳过/忽略 gdb 中的外部代码

c - C中的空语句执行时间

java - 为什么编译器会警告资源泄漏?

cocoa - 警告 : comparison is always true due to limited range of data type causes crash