无符号位域的类型:int或unsigned int

时间:2011-05-12 11:46:03

标签: c c99 bit-fields

C99标准的第6.3.1.1节包含:

  

以下内容可用于   表达式int或者unsigned int   可以使用_Bool

     

[...] int类型的位字段,   signed intunsigned intint

     

如果int可以代表所有值   原始类型,值是   转换为unsigned int;否则,它   转换为unsigned int

在我看来,这意味着int位字段被提升为int,除非无符号位字段的宽度等于struct S { unsigned f:32; } x = { 28349}; unsigned short us = 0xDC23L; main(){ int r = (x.f ^ ((short)-87)) >= us; printf("%d\n", r); return r; } 的宽度,在这种情况下,最后一个短语适用。

我有以下程序:

int

执行此程序的两个系统({{1}}在两个系统上都是32位)。一个系统说这个程序打印1,另一个系统说它打印0.我的问题是,我应该在哪两个系统中提交错误报告? (我倾向于针对打印0的系统提交报告,因为上面的摘录)

2 个答案:

答案 0 :(得分:3)

标准委员会似乎已经发现了这种模糊性,因为目前的草案澄清了这句话:

  

如果int可以表示的所有值   原始类型(受限于   宽度,对于位字段),值   转换为int;

答案 1 :(得分:1)

我的读数和你一样:int的大小的无符号位域应该有unsigned int作为类型,小于它应该签署int类型的int。

我访问的编译器(x86上的gcc,Sparc上的Sun CC,POWER上的IBM xlC)具有与此读数匹配的行为(在程序中打印1,如果位域减少到31位则打印0或签名)。