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

Стандарт С++ требует, чтобы максимум целых чисел без знака имел вид 2 ^ N-1?

Для T, чтобы std::is_integral<T>::value && std::is_unsigned<T>::value был true, гарантирует ли стандарт С++, что:

std::numeric_limits<T>::max() == 2^(std::numeric_limits<T>::digits)-1

в математическом смысле? Я ищу доказательство этого, основанное на цитатах из стандарта.

4b9b3361

Ответ 1

С++ задает диапазоны интегральных типов по ссылке на стандарт C. В стандарте C говорится:

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

Кроме того, С++ требует:

Незнакомые целые числа должны подчиняться законам арифметики по модулю 2 n где n - количество бит в представлении значений этого конкретного размера целых чисел.

Полагая все это вместе, мы обнаруживаем, что неподписанный интегральный тип имеет n битов значения, представляет значения в диапазоне [0, 2 n) и подчиняется законам арифметики по модулю 2 п.

Ответ 2

Я считаю, что это подразумевается [basic.fundamental]/4 (N3337):

Неподписанные целые числа, объявленные unsigned, должны подчиняться законам арифметики по модулю 2^n, где n - число бит в представлении значений этого конкретного размера целых чисел.