Раздел 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, из-за выдержки выше)