Тип битовых полей без знака: int или unsigned int

Раздел 6.3.1.1 стандарта C99 содержит:

Следующее может использоваться в выражение в любом месте 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 32-битный в обеих системах). Одна система говорит, что эта программа печатает 1, а другая говорит, что она печатает 0. Мой вопрос в том, для какой из двух систем мне следует отправить отчет об ошибке? (Я склоняюсь к тому, чтобы заполнить отчет против системы, которая печатает 0, из-за выдержки выше)

11
задан Pascal Cuoq 12 May 2011 в 11:46
поделиться