Диапазон перечислений enum

Читаю Страуступа - Язык программирования C++, специальное издание, и хотел бы уточнить некоторые моменты. На страницах 115 - 116 рассказывается по диапазоны перечислений (enum). Цитата:

Диапазон значений перечисления определяется следующим об­разом. Пусть n - максимальное возможное значение элемента перечисления. Пусть n такое минимальное целое, что 2^m-1 больше или равно n. Тогда верхняя граница диапазона равна 2^m-1. Если наименьший элемент имеет неотрицательное значение, нижняя гра­ница диапазона равняется нулю. Если наименьшее значение элемента отрицательно, нижней границей диапазона является наименьшая ближайшая отрицательная степень двойки плюс 1. Таким образом, диапазон определяется минимальным количеством бит, требуемым для представления значений всех элементов перечисления. Например:

enum el { dark, light }; // диапазон 0 : 1

enum е2 {а = 3, b = 9 }; // диапазон 0 : 15

еnum е3 { min = -10, max = 1000000 ); // диапазон -1048576 : 1048575

И всё здесь понятно, кроме одного:

Если наименьшее значение элемента отрицательно, нижней границей диапазона является наименьшая ближайшая отрицательная степень двойки плюс 1.

Если смотреть третью строку примера:

еnum е3 { min = -10, max = 1000000 ); // диапазон -1048576 : 1048575

То в случае с max понятно, почему диапазон 1048575, а вот в случае с min откуда берется граница -1048576 - не понятно. Если следовать правилам вычисления, т.е. ближайшая отрицательная степень двойки + 1 - то я никогда не получу значение -1048576.

Объясните пожалуйста, где и что я понимаю не так.


Ответы (2 шт):

Автор решения: HolyBlackCat

Действительно как-то непонятно написано.

Нижняя граница либо равна 0 (если отрицательных элементов нет), либо равна минус верхней границе минус 1.

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

→ Ссылка
Автор решения: Serj Chen

диапазон значений при наличии отрицательных элементов равен [ -2^k; 2^k-1], для 1 000 000 k=20, при наличии отрицательного элемента (-10) получаем диапазон [-2^20; 2^20-1] = [-1048576 ;1048575].

→ Ссылка