С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 168, средняя оценка - 4.99
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
#1

Тип char.Signed/unsigned.Отличие типов данных. - C++

30.08.2009, 22:17. Просмотров 22896. Ответов 51
Метки нет (Все метки)

Вопрос немного может быть не туда... Прошу прощения. Пишу прошивку к контроллеру, на С. Интересует отличие типов данных. ДОпустим есть тип char и тип unsigned char. Первый -128...127, а второй 0...255 соответственно. Оба типа занимают 8 бит. В чем разница?? Или разница в обработки типов библиотеками(к примеру) или правильном распозновании например кодировки ASCII ну и т.д. Интересует разница на битовом уровне. Т.е. по идее и там и там 8 бит..

Вопрос появился, когда мне необходимо было считать байт из регистра. Для этого я завел переменную(допустим t) типа char, считал байт. Если я правильно понимаю t фактически это тоже байт памяти, поэтому при считывании регистра в эту переменную t у меня все эти 8 бит просто дублируются. Вопрос что бы изменилось если бы я переменную обозначил типа unsigned char?? И вообще пишут что тип char это символ, а мне не очень понятно ГДЕ/ЧТО/КАК этот символ. И как СИМВОЛ отличается от типа ИНТЕДЖЕР например(кроме того что int - 16 бит)??
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2009, 22:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Тип char.Signed/unsigned.Отличие типов данных. (C++):

Значения типов данных (signed, unsigned, char) - C++
Програмирую я месяца два,но не понимаю значения типов данных : signed, unsigned, char...Помогите..

Надо перевести переменную типа unsigned char* в signed int и обратно - C++
у меня есть переменная типа unsigned char*, мне нужно перевести ее в signed int , провести арифметические вычисления и затем перевести ее...

Приведение типов unsigned char[2] to unsigned char [64] - C++
Добрый день! Подскажите пожалуйста, как поступить. Есть простая функция main int main() { SHA1Context sha; uint8_t...

8-битовый тип signed char может представлять значения от -128 до 127 - C++
8-битовый тип signed char может представлять значения от -128 до 127 Кто может растолковать как это понимать, от 128 до 127 -...

Signed/Unsigned - C++
Здравствуйте! Стал изучать ЯП C. Не совсем могу понять, что означает Signed и Unsigned (как я понял означает наличие знака(+ либо -) или...

Сравнение чисел unsigned и signed - C++
Результат: 60000 и -5536. По какому принципу выводится значение, если заданное число выходит из диапазона, как в коде? Диапазоны:...

51
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.08.2009, 22:31 #2
например:

C
1
2
3
4
5
    char ch = -1;
    unsigned char uch = ch;
 
    int boolean = ch == uch;
    int comp = memcmp (&ch, &uch, sizeof (char));
в результате boolean окажется равным нулю, что означает, что результат сравнения отрицательный (не равно), а comp тоже окажется равным нулю, что означает положительный результат, т.е. равно. в памяти - то же самое, но там где важен тип, будут различия.
1
RNT
Автор FAQ
3135 / 355 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
30.08.2009, 22:34 #3
Интересует отличие типов данных. ДОпустим есть тип char и тип unsigned char. Первый -128...127, а второй 0...255 соответственно. Оба типа занимают 8 бит. В чем разница??
В signed char один бит обозначает знак . Поэтому модуль числа задают только 7 битов
1
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
30.08.2009, 22:47  [ТС] #4
Ну короче я так понимаю на этапе отдельных битов разницы особо нет. Завел переменную, записал в нее регистр и особо не важно какой у нее тип, лишь бы размер подходил. А так последовательность бит будет одинаковой. А вот как эту последовательность будут интерпретировать различные функции это уже второй вопрос...

Добавлено через 2 минуты
Еще один маленький пример. Можно ли инкрементировать переменную типа char. Вроде символы как-то не принято инкрементировать. Но с другой сторону это всего лишь последовательность 8 бит. И допустим у нас переменная типа чар со значением 0xDA. Ее ведь легко можно инкрементировать до значения 0xDB ??

Добавлено через 3 минуты
И еще один)) Вот переменная var, типа char. И допустим ей присвоили var = 'a'; Это значит что в ячейку памяти записали один байт информации скажим в кодировке ASCII. А в программе и отладчике мы видим уже интерпретированное значение, а не двоичную/шестнадцатеричную форму. Так ли это??
0
RNT
Автор FAQ
3135 / 355 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
30.08.2009, 22:56 #5
И вообще пишут что тип char это символ, а мне не очень понятно ГДЕ/ЧТО/КАК этот символ. И как СИМВОЛ отличается от типа ИНТЕДЖЕР например(кроме того что int - 16 бит)??
Просто прграмма считает что char хранит букву , вроде если вывести переменную char через поток cout , выведется буква , а не число

Добавлено через 7 минут
Еще один маленький пример. Можно ли инкрементировать переменную типа char.
Можно
1
XuTPbIu_MuHTAu
Эксперт С++
2228 / 743 / 10
Регистрация: 27.05.2008
Сообщений: 1,498
30.08.2009, 22:59 #6
В языке C попросту нет символьного типа. Тип char большинством компиляторов по умолчанию интерпретируется как signed char(хотя эту опцию можно обычно менять). Символов нету. Когда ты пишешь var='a' на место 'a' подставляется соответствующая цифра из таблицы. Инкрементирование работает так же как и для инта,и вообще операции сложения и вычитания не отличаются для дополнительного кода(signed) и обычного (unsigned).

Кстати,спасибо автору за хороший вопрос. Я его закреплю,поскольку многие новички(и не очень) сбиваются с толку,работая с этим типом.
1
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
30.08.2009, 23:01 #7
Цитата Сообщение от toxxin Посмотреть сообщение
И еще один)) Вот переменная var, типа char. И допустим ей присвоили var = 'a'; Это значит что в ячейку памяти записали один байт информации скажим в кодировке ASCII. А в программе и отладчике мы видим уже интерпретированное значение, а не двоичную/шестнадцатеричную форму. Так ли это??
Не обязательно, все зависит от отладчика и программы. Можно самому задать формат отображаемого символа, хочешь - в символьном виде, хочешь - в виде 16-ричного кода и т.д.
1
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
30.08.2009, 23:13 #8
Цитата Сообщение от toxxin Посмотреть сообщение
Но с другой сторону это всего лишь последовательность 8 бит. И допустим у нас переменная типа чар со значением 0xDA. Ее ведь легко можно инкрементировать до значения 0xDB ??
если переменная sined char, то при присвоении ей 0xDA произойдет переполнение и в результате в переменную будет записано отрицательное число. при его увеличении на 1, получится тоже отрицательное число, чуть меньшее по модулю. но если ты передашь эту переменную в функцию, которая принимает unsigned char, то она будет воспринимать значение как 0xDA bkb 0xDB соответственно
1
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
31.08.2009, 00:01 #9
А вот для языка C++ мы имеем три разных типа: signed char, unsigned char, char.
Это так - чтобы не путаться
1
RNT
Автор FAQ
3135 / 355 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.08.2009, 00:14 #10
А вот для языка C++ мы имеем три разных типа: signed char, unsigned char, char.
Это так - чтобы не путаться
Я думал что char - это в разных компиляторах по умолчанию либо signed char либо unsigned char Так что же такое char ?
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
31.08.2009, 00:26 #11
С и C++ - два разных языка и в этом вопросе отличаются.
Обычно в C char == signed char.
Опцией можно сделать char == unsigned char, но не рекомендую

В C++ три разных типа: char, signed char, unsigned char.
char скорее всего есть signed char, но это отдельный тип.
То есть без отдельного преобразования просто так не переводятся.
Хотя все они конечно переводятся в int.
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
31.08.2009, 00:38 #12
Цитата Сообщение от RNT Посмотреть сообщение
Я думал что char - это в разных компиляторах по умолчанию либо signed char либо unsigned char Так что же такое char ?
Целочисленная переменная размером в 1 байт. Если совсем точно, то количество битов в переменной типа char определено в limits.h как CHAR_BIT.
0
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
31.08.2009, 00:46 #13
Цитата Сообщение от RNT Посмотреть сообщение
В signed char один бит обозначает знак . Поэтому модуль числа задают только 7 битов
Читайте внимательно, 7 бит это не модуль.

toxxin, при работе с байтами, разницы нет. Но, во-первых int не 8 бит, и, во-вторых, большой гемор светит, когда будете присваивать signed/unsigned между разными по размеру типами.
Например - signed char равный -50 записать в signed long.
1
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
31.08.2009, 00:49 #14
signed char равный -50 записать в signed long

Продемонстрируй какие это проблемы сулит, а то что-то сомнительно как-то.
C
1
2
3
4
long l;
char ch= (char)-50;
 
l= ch;
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
31.08.2009, 00:57 #15
Цитата Сообщение от odip Посмотреть сообщение
какие это проблемы сулит...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
/* int vs char */
 
int main(){
    int i = 254;
    signed char sc = (char)i;
    unsigned char uc = (char)i;
    
    printf("i = %d; sc = %d; uc = %d\n", i, sc, uc);
    
    return(0);
}
Код
i = 254; sc = -2; uc = 254
0
31.08.2009, 00:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2009, 00:57
Привет! Вот еще темы с ответами:

Comparison between signed and unsigned integer expressions - C++
Много вот таких варнингов: Comparison between signed and unsigned integer expressions FreeBSD 10 gcc 4.8 Ввожу:gmake libthecore...

Типы данных - где нужно использовать char, а где unsigned char? - C++
Всем привет! У меня вопрос, искал ответ на него, но безуспешно. Вопрос следующий: есть два типа char и unsigned char. Я понимаю, что в...

[C++ Warning] Unit1.cpp(24): W8012 Comparing signed and unsigned values - C++
Код : #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std; ...

Разница между char и signed char - C++
Не понимаю в чем разница между char и signed char, ведь char по умолчанию знаковый. Не комплилируется следующий фрагмент кода: void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.