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

Pas*_*uoq 11 c c99 bit-fields

C99标准的第6.3.1.1节包含:

以下内容可用于任何地方intunsigned int可能使用的表达式:

[...]类型的位字段_Bool, int,signed int,或unsigned int.

如果a 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Jen*_*edt 3

标准委员会似乎已经发现了这种歧义,因为当前草案澄清了这句话:

如果 int 可以表示原始类型的所有值(对于位域而言,受宽度限制),则该值将转换为 int;