C99标准的第6.3.1.1节包含:
以下内容可用于 表达式
int
或者unsigned int
可以使用_Bool
:[...]
int
类型的位字段,signed int
,unsigned int
或int
。如果
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的系统提交报告,因为上面的摘录)
答案 0 :(得分:3)
标准委员会似乎已经发现了这种模糊性,因为目前的草案澄清了这句话:
如果int可以表示的所有值 原始类型(受限于 宽度,对于位字段),值 转换为int;
答案 1 :(得分:1)
我的读数和你一样:int的大小的无符号位域应该有unsigned int作为类型,小于它应该签署int类型的int。
我访问的编译器(x86上的gcc,Sparc上的Sun CC,POWER上的IBM xlC)具有与此读数匹配的行为(在程序中打印1,如果位域减少到31位则打印0或签名)。