我目前有一个关于警告的问题。我有一个方法返回u8
值,其中u8
定义为unsigned char
。
u8 foo (...)
在一个结构中,我有一个只需要4位的成员x
。
struct {
u8 x : 4;
u8 y : 4;
} s;
现在我想将foo
的返回值分配给x
。但是,我的编译器会针对从unsigned char
到unsigned char : 4
的转换发出可能丢失的警告。然而,这样的演员不被承认。
struct_inst.x = (u8 : 4)foo(..);
这个的正确语法是什么?
答案 0 :(得分:4)
与你的:4
一起使用的Bitfield类型在C类型系统中不是正确的类型,所以你不能在演员阵容中使用它们。
您的编译器警告有点过分,从一个无符号类型到另一个类型的转换已明确定义。警告的意义是正确的,然而,将8位类型转换为4位字段可能会丢失信息。也许你可以通过用0xF
和你的返回值来使你的编译器沉默,这样编译器就会发现你愿意抛弃更高的位。
顺便说一句:
uint8_t
中的<stdint.h>
类型具有您想要的属性。
在大多数情况下,使用比int
窄的类型并不是一个好主意,因为无论如何它们总是在算术中提升为int
。如果你获得的几个字节真的值得,只使用它们。如果您的系统中有数GB的内存,则不会出现这种情况。