Рассмотрим пример кода:
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 или есть дополнительные предположения, которые необходимо добавить?