1

我有这样的结构

typedef struct mystruct{
    char* name;
    int age : 5;
}instr;

int main(){
    instr object1={.name= "tiny",.age=20};
    printf("%d and %d\n",object1.age);
    return 0;
}


结构定义中线int age : 5的含义是什么?

对于较低的值,而不是此处的 5,我会收到编译警告

隐式常量转换溢出 [-Woverflow]

4

1 回答 1

1

带符号的 5 位整数(由您的int age : 5;位域定义)可以保存 -16 .. +15 范围内的值,但 20 超出此范围。

使用unsigned int或使用 6 位或更多位。实际上,人们可能已经大到需要 7 位无符号或 8 位有符号。

位域是语言中奇怪的部分。我怀疑你是否会像这里一样从使用年龄中受益。您可能会使用某种char值,尽管即使使用 an 也不会浪费结构中的空间int(在 32 位机器上它的大小为 8 字节,在 64 位机器上可能为 16 字节) .

在 ISO/IEC 9899:2011, §6.7.2.1 Struct and union specifiers 中,脚注 125 说:

125)如上面 6.7.2 中所述,如果使用的实际类型说明符是int或定义为的 typedef-name int,则位域是有符号还是无符号是实现定义的。

从您收到的警告消息中可以看出int,编译器的普通位字段已签名。您应该明确说明您希望类型是signed int还是unsigned int

于 2013-07-07T02:56:53.750 回答