Напечатайте положительное целое число со знаком в без знака (и наоборот) - PullRequest
1 голос
/ 17 марта 2019
union   Positive_Small {
    int8_t  s;
    uint8_t u;
};

union Positive_Small    x = {.s = 3};
union Positive_Small    y = {.u = 4};

assert(x.u == 3);
assert(y.s == 4);

Это определенное поведение?Гарантирует ли Стандарт, что положительный диапазон целочисленного типа со знаком имеет такое же представление, что и его беззнаковый эквивалент?

Я полагаю, что нет достаточно сумасшедшей реализации (возможно, DS9K?), Чтобы не делать этого, но так ли это?определен

1 Ответ

4 голосов
/ 17 марта 2019

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

C11 Раздел 6.2.5 Типы определяет это (и множество других терминов и поведения):

¶6 Для каждого из целочисленных типов со знаком существует соответствующий (но другой) целочисленный тип без знака (обозначенный ключевым словом unsigned), который использует одинаковый объем памяти (включая информацию о знаке) и имеет одинаковое выравнивание. требования. Тип _Bool и целочисленные типы без знака, которые соответствуют стандартным целочисленным типам со знаком, являются стандартными целочисленными типами без знака . Целочисленные типы без знака, которые соответствуют расширенным целочисленным типам со знаком, представляют собой расширенные целочисленные типы без знака . Стандартные и расширенные целочисленные типы без знака вместе называются целочисленные типы без знака . 40)

¶9 Диапазон неотрицательных значений целочисленного типа со знаком является поддиапазоном соответствующего целочисленного типа без знака, и представление одного и того же значения в каждом типе одинаково. 41) Вычисление, включающее операнды без знака никогда не могут переполниться, потому что результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю на число, которое на единицу больше наибольшего значения, которое может быть представлено результирующим типом.

40) Следовательно, любое утверждение в этом стандарте о целочисленных типах без знака также применимо к расширенным целочисленным типам без знака.

41) Те же требования к представлению и выравниванию подразумевают взаимозаменяемость в качестве аргументов функций, возвращаемых значений из функций и членов объединений.

Как указано dbush * Раздел 10.6 *, 6.2.6 Представление типов и Раздел 6.2.6.2 Целочисленные типы , в частности, также содержит соответствующую информацию:

For2 Для целочисленных типов со знаком биты представления объекта должны быть разделены на три группы: биты значения, биты заполнения и бит знака. Там не должно быть никаких битов заполнения; signed char не должно иметь никаких битов заполнения. Должен быть ровно один знаковый бит. Каждый бит, который является битом значения, должен иметь то же значение, что и тот же бит в представлении объекта соответствующего типа без знака (если в типе со знаком есть M битов значения и N в беззнаковом типе M ≤ N ). Если бит знака равен нулю, он не должен влиять на результирующее значение. Если бит знака равен единице, значение должно быть изменено одним из следующих способов:

  • соответствующее значение со знаком, бит 0 отрицается ( знак и величина );
  • знаковый бит имеет значение - (2 M ) ( дополнение к двум );
  • знаковый бит имеет значение - (2 M - 1) ( добавка к единице ).

Что из этого применимо, определяется реализацией, а именно, равно ли значение со знаковым битом 1 и всеми нулевыми битами (для первых двух) или со знаковым битом и всеми битами значения 1 (для дополнения единиц) представление ловушки или нормальное значение. В случае знака, величины и их дополнения, если это представление является нормальным значением, оно называется отрицательный ноль .

...