C将unsigned char转换为unsigned char:4

时间:2016-07-23 19:03:47

标签: c

我目前有一个关于警告的问题。我有一个方法返回u8值,其中u8定义为unsigned char

u8 foo (...)

在一个结构中,我有一个只需要4位的成员x

struct {
     u8 x : 4;
     u8 y : 4;
} s;

现在我想将foo的返回值分配给x。但是,我的编译器会针对从unsigned charunsigned char : 4的转换发出可能丢失的警告。然而,这样的演员不被承认。

struct_inst.x = (u8 : 4)foo(..);

这个的正确语法是什么?

1 个答案:

答案 0 :(得分:4)

与你的:4一起使用的Bitfield类型在C类型系统中不是正确的类型,所以你不能在演员阵容中使用它们。

您的编译器警告有点过分,从一个无符号类型到另一个类型的转换已明确定义。警告的意义是正确的,然而,将8位类型转换为4位字段可能会丢失信息。也许你可以通过用0xF和你的返回值来使你的编译器沉默,这样编译器就会发现你愿意抛弃更高的位。

顺便说一句:

  • uint8_t中的<stdint.h>类型具有您想要的属性。

  • 在大多数情况下,使用比int窄的类型并不是一个好主意,因为无论如何它们总是在算术中提升为int。如果你获得的几个字节真的值得,只使用它们。如果您的系统中有数GB的内存,则不会出现这种情况。

  • Bitfields比窄整数类型更有用。
相关问题