У 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?
Также есть ответ на С++?
Ответы
Ответ 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 бит.