Слово стандарта 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:
В противном случае новый тип подписывается, и значение не может быть представлено в нем; либо результат определяется реализацией, либо определяется определяемый реализацией сигнал.