Слово стандарта C в выражении switch - PullRequest
4 голосов
/ 09 ноября 2011

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

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

Предположим, что CHAR_BIT = 8, и присвоение реализации и маску, определенные реализацией, осуществляется путем интерпретации битовых комбинаций: 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

, если charunsigned c = 255, mask = 254, c & mask = 254, (unsigned)(c & mask) = 254

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

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

1 Ответ

1 голос
/ 09 ноября 2011

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

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

char c = 0xff;

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

Стандарт C 6.3.1.3:

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

...