代码之家  ›  专栏  ›  技术社区  ›  John Hascall

从“unsigned int”转换为“unsigned char”可能会更改其值[重复]

  •  0
  • John Hascall  · 技术社区  · 6 年前

    代码如下:

    #include <stdint.h>
    
    unsigned char f(uint32_t RGBA)
    {
      return (RGBA>>24) & 0xFF;
    }
    

    编译时使用 -Wconversion

    我看过C99标准,不明白这里发生了什么。如果我移除 & 运算符则始终发出警告,这可能是好的,因为表达式(整数提升后)的结果大于 unsigned char . 我唯一的想法是,对于较小的移位,这个警告被忽略,只是因为gcc很聪明,而且可以看到结果是8位的,因为标准并没有将此作为特殊情况。我就在这里吗?

    为什么移位值很重要?这是GCC错误吗?Clang似乎没有对任何移位值发出警告。

    0 回复  |  直到 9 年前
        1
  •  4
  •   dbush    9 年前

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

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

    自4.4.0版(2009年7月14日首次报道)以来,它似乎一直存在,并有5个副本。根据bug报告中的评论,关于如何处理这个问题似乎有一些争论。

        2
  •  -1
  •   vvaltchev    6 年前

    至少在 gcc 5.4 , 6.x 7.x 这个问题有一个简单的解决方法,就是使用cast:

    #include <stdint.h>
    
    unsigned char f(uint32_t RGBA)
    {
      return (unsigned char) ((RGBA>>24) & 0xFF);
    }