Слово стандарта C в операторе switch

Рассмотрим этот пример кода:

char c = 0xff;
char mask = 0xfe;
switch ((unsigned)(c & mask)) {
case -2: /* do task 1 */ break;
default:   /* do task 2 */
}

Предположим, что CHAR_BIT = 8, и присвоение, определенное реализацией, c и mask осуществляется через интерпретацию битовых комбинаций: 11111111 и 11111110, и допускаются отрицательные нули. Поведение этого кода, следовательно:

если char подписан и реализация использует дополнение 2, c = -1, mask = -2, c & mask = -2, (unsigned)(c & mask) = UINT_MAX - 1,

если char подписан и реализация использует дополнение 1, c = 0, mask = -1, c & mask = 0, (unsigned)(c & mask) = 0,c ноль, а не отрицательный ноль, потому что C не позволяет создавать отрицательный ноль посредством присваивания.

если char подписан, а реализация использует величину со знаком, c = -127, mask = -126, c & mask = -126, (unsigned)(c & mask) = UINT_MAX - 125

если символ не подписан c = 255, mask = 254, c & mask = 254, (unsigned)(c & mask) = 254

Регистр постоянный -2 преобразуется в тот же тип, что и управляющее выражение, поэтому значение UINT_MAX - 1, Следовательно, он будет соответствовать, только если char подписан, а реализация использует дополнение 2.

Это правильно в соответствии со стандартом C или есть дополнительные предположения, которые необходимо добавить?

1 ответ

Это правильно в соответствии со стандартом C

На самом деле, нет. Если char подписан и 8-битный (т.е. CHAR_MAX меньше 255), то линия

char c = 0xff;

определяется реализацией. Он может делать то, что вы говорите, но не может.

Стандарт С 6.3.1.3:

В противном случае новый тип подписывается, и значение не может быть представлено в нем; либо результат определяется реализацией, либо определяется определяемый реализацией сигнал.

Другие вопросы по тегам