диапазон для целочисленных значений символов в c ++ - PullRequest
13 голосов
/ 04 ноября 2008

Я читаю Язык программирования C ++ , и в нем Страуструп заявляет, что значение типа char может варьироваться от 0 до 255 или от -127 до 127, в зависимости от реализации. Это правильно? Похоже, что это должно быть от -128 до 127. Если нет, то почему во второй реализации их только 255 возможных значений, а не 256.

Ответы [ 5 ]

16 голосов
/ 04 ноября 2008

Вы застряли в дополнении до двух , размышляя - стандарт C ++ не определяет представление, используемое для отрицательных чисел!

Если ваш компьютер (не дай бог) использует их дополнение для представления отрицательных чисел, у вас есть диапазон от -127 до + 127 в 8-битном байте. С другой стороны, у вас есть два возможных представления для нуля ...

Однако в реальном мире вы вряд ли встретите свой комплиментный компьютер .

4 голосов
/ 05 ноября 2008

Неправильно думать, что неподписанный символ находится в диапазоне от 0 до 255. Это только его минимальный диапазон. символ должен иметь не менее 8 бит, а подписанный символ, неподписанный символ и сам символ могут действительно иметь более 8 бит. так что это означает, что беззнаковый символ может выходить за пределы 255. хотя по общему признанию, у меня нет реализации, в которой было бы больше 8 бит, это теоретически возможно. это указано в стандарте c89 (на котором основывается c ++ 03), документируя файл limit.h (CHAR_BIT, UCHAR_MAX, CHAR_MAX).

1 голос
/ 05 ноября 2008

Поскольку стандарт ничего не говорит о типе символа, «char» может быть:

  1. "unsigned char" (0-255) на некоторых компиляторах (пример: компилятор TexasInstruments для их процессоров ARM - серия OMAP)

  2. "подписанный символ" (-128-127) на большинстве компиляторов (gcc, MSVC ...)

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

1 голос
/ 05 ноября 2008

Типы символов в C и C ++

Из прочтения кажется, что это может быть любой из них, в зависимости от реализации.

0 голосов
/ 05 ноября 2008

Спасибо Родди и Эстебану Бренесу за полезные ответы.

Это мое текущее понимание:

Есть три варианта. Если значения представлены как беззнаковые, char будет в диапазоне от 0 до 255. Если значения представлены как подписанные в дополнении к двум, char будет варьироваться от -128 до 127. Наконец, если значения представлены как подписанные в дополнении символ будет варьироваться от -127 до 127. Эта последняя возможность предполагает, что будет только 255 возможных значений в отличие от 256 возможных значений для первых двух реализаций, но это не учитывает отрицательный ноль в представлениях дополнения. .

...