这是代码:
#include <stdint.h>
unsigned char f(uint32_t RGBA)
{
return (RGBA>>24) & 0xFF;
}
Run Code Online (Sandbox Code Playgroud)
当使用-Wconversion它编译导致"警告:从'uint32_t {aka unsigned int}'转换为'unsigned char''可能会改变其值[-Wconversion]".如果我将移位值降低到23或更低,则警告消失.
我查看了C99标准,我不明白这里发生了什么.如果我删除了&运算符,那么总是会发出警告,这可能是好的,因为表达式(在整数提升之后)的结果大于unsigned char.我唯一的想法是,对于较小的班次省略警告只是因为gcc是聪明的并且看到结果仍然是8位,因为标准不会使这成为特殊情况.我在这儿吗?
为什么班次价值很重要?这是GCC的错误吗?Clang似乎没有为任何班次值产生警告.
我在64位Linux系统上使用GCC 5.3.1.
-Wconversion 当我用g ++为一个位字段赋值时,会产生警告.
源文件:
struct Foo
{
public:
unsigned int x : 4;
unsigned int y : 9;
unsigned int z : 17;
};
int main(int, char**)
{
int a = 12;
Foo f;
f.x = a;
f.x = (unsigned int)a;
f.x = (unsigned char)a;
f.x = (unsigned short)a;
f.x = (unsigned)a;
f.y = a;
f.y = (unsigned int)a;
f.y = (unsigned char)a; // no warning, sizeof(char) < 9
f.y = (unsigned short)a;
f.y = (unsigned)a;
f.z = a;
f.z …Run Code Online (Sandbox Code Playgroud)