Тип беззнаковых битовых полей: int или unsigned int - PullRequest
11 голосов
/ 12 мая 2011

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

Ответы [ 2 ]

3 голосов
/ 12 мая 2011

Кажется, что эта двусмысленность уже была обнаружена комитетом по стандартам, так как текущий проект разъясняет это предложение:

Если int может представлять все значения оригинальный тип (как ограничено ширина, для битового поля), значение преобразуется в int;

1 голос
/ 12 мая 2011

Мое чтение такое же, как и у вас: битовое поле без знака размером с int должно иметь тип unsigned int, меньше, чем int, оно должно иметь тип int со знаком.

Компиляторы, к которым у меня есть доступ (gcc на x86, Sun CC на Sparc, IBM xlC на POWER), имеют поведение, соответствующее этому показанию (печать 1 в вашей программе, печать 0, если битовое поле уменьшено до 31 бита или сделано подписанным ).

...