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