Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > вопрос о char


Автор: Kostia 22.5.2003, 23:45
Подскажите, пожалуйста, почему char позволяет использовать знаковые модификаторы: signed и unsigned? Как к символам можно применять знаки?

Автор: brb 23.5.2003, 00:14
char has size 8 bit
signed char uses 8th (highest) bit as a sign( 0 - positive, 1 - negative). So it has range from -128 to 127;
unsigned char uses all 8 bits as data. So it range is from 0 to 255.
The same rule works with int and long. Range is different but idea is the same.

Автор: vickr 23.5.2003, 09:01
Все верно. Проще говоря, char - это такое же числовой тип, как и int (только меньшего размера), значит, он тоже может использоваться как в знаковом так и беззнаковом вариантах. Физически-то переменная типа char не может хранить в памяти символ, она хранит последовательность из 8 бит, которая может интерпретироваться как число и как символ (с ASCII кодом равным этому числу).

Автор: Kostia 23.5.2003, 12:57
2Vickr
Теперь понятно, спасибо.

Автор: Alex101 23.5.2003, 16:29
Кстати, в винде (по крайней мере в MSVC 6.0) русские буквы имеют отрицательные коды.
char долен быть signed.

Автор: DarkDS 23.5.2003, 16:39
Цитата(Alex101 @ 23.5.2003, 16:29)
Кстати, в винде (по крайней мере в MSVC 6.0) русские буквы имеют отрицательные коды.
char долен быть signed.

Нет. Русские буквы имеют код больше 127. Если ты пишешь в unsigned, то будешь иметь код букв больше 127, а если возмешь знаковый, то код будет отрицательный, так как знак минус определяется последними битами...

Автор: Alex101 23.5.2003, 16:46
Цитата(DarkDS @ 23.5.2003, 13:39)
Нет. Русские буквы имеют код больше 127. Если ты пишешь в unsigned, то будешь иметь код букв больше 127, а если возмешь знаковый, то код будет отрицательный, так как знак минус определяется последними битами...

Я тоже так думал, пока не объявил unsigned char.
Попробуй.

Автор: DarkDS 23.5.2003, 17:10
Пожалуйста проект для ВС 6.0 консольное приложение:
Код

#include <conio.h>
#include <iostream.h>

void main( void )
{
  unsigned char ch = '&#226;';
  cout<<(int)ch<<endl;

  do
  {
     ch = (char)_getch();
  cout<<(int)ch<<endl;
  } while( ch != 27 );
}

Выдает:
226
100
102
100
162
160
175
(где отрицательные?)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)