为什么>> 24个原因 – 转换但>> 23不?

前端之家收集整理的这篇文章主要介绍了为什么>> 24个原因 – 转换但>> 23不?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是代码
#include <stdint.h>

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

当使用-Wconversion编译时,会导致“警告:转换为’unsigned char’from’uint32_t {aka unsigned int}’可能会改变其值[-Wconversion]”.如果将shift值降低到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-07-14报道,共有5个重复.根据bug报告中的意见,似乎有一些关于如何处理它的争论.

原文链接:https://www.f2er.com/c/112687.html

猜你在找的C&C++相关文章