Подтвердить что ты не робот

У UINT_MAX все биты установлены в 1?

Этот вопрос задан раньше, но я все еще запутался.

Я знаю, что

unsigned int a = -1;

будет UINT_MAX. Но это не потому, что все биты -1 установлены. C11 говорит

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

Итак, скажем, UINT_MAX равно 100 (я знаю, что он должен быть больше 2 ^ 16-1, но теперь игнорировать это)

unsigned int a = -1; // will be
unsigned int a = -1 + UINT_MAX + 1; // 100 = UINT_MAX  

Стандарт только говорит UINT_MAX >= 2^16-1. Но говорит ли он, что это должно быть 2 ^ n-1?

Также есть ответ на С++?

4b9b3361

Ответ 1

В C максимальное значение для целых чисел без знака должно быть в форме 1: 2 N - 1.

Таким образом, все биты значений значения UINT_MAX будут установлены в 1. Возможны биты заполнения, значения которых не определены.


1 (Цитируется по: ISO/IEC 9899: 201x 6.2.6.2 Целые типы 1)
Для беззнаковых целочисленных типов, отличных от unsigned char, биты представления объекта должны быть разделены на две группы: биты значений и биты заполнения (их не должно быть ни одного из последних). Если бит N значений бит, каждый бит должен представлять различную мощность 2 между 1 и 2 N-1 так что объекты этого типа должны быть способны отображать значения от 0 до 2 N -1, используя чисто двоичное представление; это должно быть известно как представление стоимости. Значения любых битов дополнений не определены.

Ответ 2

Нет, не совсем.

Беззнаковый тип может состоять из битов значения и битов заполнения.

Вы правы, что биты значения всегда будут установлены в 1 для максимального значения, но конкретные значения битов заполнения остаются в реализации. Таким образом, это означает, что UINT_MAX должен быть числом Мерсенны. Другие требования указывают, что он не может быть меньше 65535.

C и С++ эквивалентны в этом отношении.

Ответ 3

Вы правы, чтобы сказать, что по определению преобразований -1, преобразованный в unsigned int, гарантированно будет UINT_MAX. Это не имеет никакого отношения к какому-либо битовому шаблону. Если была реализация, где UINT_MAX было 100, тогда -1, преобразованный в unsigned int, был бы 100.

Есть причины, по которым UINT_MAX не может быть 100: один, потому что он должен быть ≥ 2 ^ 16-1, но это позволит UINT_MAX = 1,000,000. Во-вторых, поскольку unsigned int должно иметь двоичное представление с некоторым фиксированным числом n битов значения, поэтому UINT_MAX = 2 ^ n - 1.

Возможно, что INT_MAX = 2 ^ 31 - 1 и UINT_MAX = 2 ^ 31 - 1 (не 2 ^ 32 - 1, как это обычно бывает). В этом случае -1 будет иметь 32 бита; -1 cast to unsigned int будет 2 ^ 31 - 1 и будет иметь только 31 бит.