Диапазон для целочисленных значений символов в C++
Я читаю язык программирования C++, и в нем Страуструп утверждает, что значение int для символа может варьироваться от 0 до 255 или от -127 до 127, в зависимости от реализации. Это правильно? Похоже, что это должно быть от -128 до 127. Если нет, то почему во второй реализации их всего 255 возможных значений, а не 256.
5 ответов
Вы застряли в раздумьях о двух дополнениях - стандарт C++ не определяет представление, используемое для отрицательных чисел!
Если ваш компьютер (не дай бог) использует свое дополнение для представления отрицательных чисел, у вас есть диапазон от -127 до + 127 в 8-битном байте. С другой стороны, у вас есть два возможных представления для нуля...
Однако в реальном мире вы вряд ли встретите свой комплиментный компьютер.
Неправильно думать, что неподписанный символ находится в диапазоне от 0 до 255. Это только его минимальный диапазон. символ должен иметь не менее 8 бит, а подписанный символ, неподписанный символ и сам символ могут действительно иметь более 8 бит. так что это означает, что беззнаковый символ может выходить за пределы 255. хотя по общему признанию, у меня нет реализации, в которой было бы больше 8 бит, теоретически это возможно. это указано в стандарте c89 (на котором основывается C++03), документируя файл limit.h (CHAR_BIT, UCHAR_MAX, CHAR_MAX).
Поскольку стандарт ничего не говорит о типе char, "char" может быть:
"unsigned char" (0-255) на некоторых компиляторах (пример: компилятор TexasInstruments для их процессоров ARM - серия OMAP)
"подписанный символ" (-128-127) на большинстве компиляторов (gcc, MSVC ...)
Чтобы убедиться, что у вас всегда есть четко определенный диапазон, вы должны использовать "подписанный символ" или "неподписанный символ".
Из чтения, что кажется, что это может быть любой из них, в зависимости от реализации.
Спасибо Родди и Эстебану Бренесу за полезные ответы.
Это мое текущее понимание:
Есть три варианта. Если значения представлены как беззнаковые, char будет в диапазоне от 0 до 255. Если значения представлены как подписанные в дополнении к двум, char будет в диапазоне от -128 до 127. Наконец, если значения представлены как подписанные в дополнении, char будет варьироваться от -127 до 127. Эта последняя возможность предполагает, что будет только 255 возможных значений в отличие от 256 возможных значений для первых двух реализаций, но это не учитывает отрицательный ноль в представлениях дополнения.,