Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

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

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

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

30.08.2009, 22:17. Просмотров 22457. Ответов 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
odip
Эксперт С++
7157 / 3219 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
31.08.2009, 01:01 #16
Во-первых не вижу обещанного long.
Во-вторых не вижу ни одной проблемы.
Явные преобразования типа ведь сделал ?
Ну так значит думал чем-то когда их делал.

Добавлено через 1 минуту
И потом понятно ведь что 254 в signed char ну никак не поместится
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
31.08.2009, 01:09 #17
Цитата Сообщение от odip Посмотреть сообщение
Во-первых не вижу обещанного long.
Во-вторых не вижу ни одной проблемы.
Явные преобразования типа ведь сделал ?
Ну так значит думал чем-то когда их делал.

Добавлено через 1 минуту
И потом понятно ведь что 254 в signed char ну никак не поместится
Ну если понятно, то и проблем быть не должно Я как-то натыкался, когда перекодировщик кириллицы из маковской в виндозную делал. Если тип для символов не задавать, как unsigned char, такую ерунду выдавал...
0
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.08.2009, 01:10 #18
В C++ три разных типа: char, signed char, unsigned char.
char скорее всего есть signed char
char != signed char != unsigned char
char==signed char
Какие-то противоречия

Цитата Сообщение от skvor Посмотреть сообщение
Читайте внимательно, 7 бит это не модуль.
Стенли Лимпман:
char, short, int и long вместе составляют целые типы, которые, в свою очередь, могут
быть знаковыми (signed) и беззнаковыми (unsigned). В знаковых типах самый левый
бит служит для хранения знака (0– плюс, 1 – минус), а оставшиеся биты содержат
значение. В беззнаковых типах все биты используются для значения. 8-битовый тип
signed char может представлять значения от -128 до 127, а unsigned char– от 0 до
255.
0
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
31.08.2009, 01:47 #19
1. C и C++ - разные языки.
2. представление целых в памяти компьютера имеет более сложную структуру
0
Somebody
2789 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
31.08.2009, 12:30 #20
http://www.open-std.org/jtc1/sc22/op...ic.fundamental
3.9.1 Fundamental types [basic.fundamental]

1 Objects declared as characters char) shall be large enough to store
any member of the implementation's basic character set. If a charac-
ter from this set is stored in a character object, the integral value
of that character object is equal to the value of the single character
literal form of that character. It is implementation-defined whether
a char object can hold negative values. Characters can be explicitly
declared unsigned or signed. Plain char, signed char, and
unsigned char are three distinct types.
A char, a signed char, and an
unsigned char occupy the same amount of storage and have the same
alignment requirements (_basic.types_); that is, they have the same
object representation. For character types, all bits of the object
representation participate in the value representation. For unsigned
character types, all possible bit patterns of the value representation
represent numbers. These requirements do not hold for other types. In
any particular implementation, a plain char object can take on either
the same values as a signed char or an unsigned char; which one is
implementation-defined.
0
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
31.08.2009, 13:42 #21
Цитата Сообщение от RNT Посмотреть сообщение
char != signed char != unsigned char
char==signed char
Какие-то противоречия
В K&R было char==signed char, но, вообще, в компиляторах это зависит от настроек.

О "модуле" целого в 7 битах
- перечитайте собственную цитату, про "модуль" там ни слова!
если знаковое целое из байта, то -1(10)==11111111(bit)

Для будущего программиста, следует иметь более тупой склад мышления и не-придумывать свойств, объектов и параметров, о которых не было речи в документации или техзадании.

Добавлено через 8 минут
Цитата Сообщение от odip Посмотреть сообщение
Во-первых не вижу обещанного long.
Во-вторых не вижу ни одной проблемы.
Явные преобразования типа ведь сделал ?
Ну так значит думал чем-то когда их делал.

Добавлено через 1 минуту
И потом понятно ведь что 254 в signed char ну никак не поместится
- а какая разница long-не-long, главное, что целые больше char
- компилятор тоже проблем не увидит
- главное осознавать действие и понимать
- человек открыл тред с вопросом, ему и объяснили
- а вот у компилятора такого понимания нет
0
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
31.08.2009, 13:58 #22
Sorry!
0
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.08.2009, 17:02 #23
Приведу отрывок из книги Крупника "Изучаем Си", может кому нибудь будет полезно.

Четыре бита, как ни крути, могут находиться лишь в 16 разных
состояниях. Но теперь этим состояниям соответствуют другие
числа. Любопытно, что за семеркой сразу следует –8(1000).
Далее идут –7(1001), -6(1010), -5(1011), и все кончается нулем.
Такой способ кодирования поначалу может показаться
странным, но на самом деле он очень удобен, потому что
позволяет заменить вычитание числа на прибавление такого же
числа, но с противоположным знаком. Например, 5 – 4 = 5+ (–
4)= 0101 + 1100=0001=1. На самом деле, при сложении чисел 5
(0101) и –4 (1100) получается 17, то есть в двоичной записи
10001. Но в нашей переменной всего 4 бита и старшая единица
вытесняется за ее пределы, остается только единица в
младшем разряде. Вот и получается, что 5 + (-4)=1.
Я заметил , что все отрицательные числа начинаются с 1 , а положительные с 0.
0
Миниатюры
Тип char.Signed/unsigned.Отличие типов данных.  
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
31.08.2009, 17:13 #24
RNT, всё правильно. Теперь обратите внимание на то, что назвали "модулем"
Из картинки видно, что ваш "модуль" -8 равен 000 !!!!
0
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.08.2009, 17:16 #25
Насчет модуля я выразился некоректно , извиняюсь
0
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.11.2010, 22:45 #26
Цитата Сообщение от RNT Посмотреть сообщение
Четыре бита, как ни крути, могут находиться лишь в 16 разных
состояниях. Но теперь этим состояниям соответствуют другие
числа. Любопытно, что за семеркой сразу следует –8(1000).
Далее идут –7(1001), -6(1010), -5(1011), и все кончается нулем.
Такой способ кодирования поначалу может показаться
странным, но на самом деле он очень удобен, потому что
позволяет заменить вычитание числа на прибавление такого же
числа, но с противоположным знаком. Например, 5 – 4 = 5+ (–
4)= 0101 + 1100=0001=1. На самом деле, при сложении чисел 5
(0101) и –4 (1100) получается 17, то есть в двоичной записи
10001. Но в нашей переменной всего 4 бита и старшая единица
вытесняется за ее пределы, остается только единица в
младшем разряде. Вот и получается, что 5 + (-4)=1.
Я бы не много уточнил у добавил, добавлять и вычитать лучше байтами, логическая структура легче вырисовывается, а именно из аналогии работы АЛУ, которое отбрасывает лишний бит не помещающийся в 8 регистр:
5 - 4 = 5 + (-4) ->
0000 0101 +
1111 1100 (дополнительный код для 4)
=
0000 0001

Добавлено через 35 минут
Цитата Сообщение от easybudda Посмотреть сообщение
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
Вот есть код:

C
1
2
3
4
5
6
7
signed char ch=255;
unsigned char uch=255;
int sig_i;
int unsig_i;
 
sig_i = ch;
unsig_i = uch;
возник вопрос какой и куда компилятор устанавливает признак, что для случая
sig_i это будет значение -1 (в двоичной форме .... 1111 1111 1111 1111 1111 1111 1111 1111), а для
unsig_i = 255 (0000 0000 0000 0000 0000 0000 1111 1111), то есть как он решает что в одном случае надо просто нули добавить слева, а в другом единицы?
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
07.11.2010, 01:30 #27
Цитата Сообщение от norge_goth Посмотреть сообщение
как он решает что в одном случае надо просто нули добавить слева, а в другом единицы?
Почитайте про распространение знака... Если переменная знакового типа signed char "поднимается" к примеру до int или unsigned int, при установленном старшем бите все старшие биты нового значения устанавливаются в 1. Если "поднимается" беззнаковый тип - unsigned char, старшие разряды заполняются нулями.
1
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
07.11.2010, 14:41 #28
Цитата Сообщение от easybudda Посмотреть сообщение
Почитайте про распространение знака... Если переменная знакового типа signed char "поднимается" к примеру до int или unsigned int, при установленном старшем бите все старшие биты нового значения устанавливаются в 1. Если "поднимается" беззнаковый тип - unsigned char, старшие разряды заполняются нулями.
то есть, как я понимаю компилятор ставит какой-то признак что число беззнаковое или знаковое и использует этот признак когда нужно перевести в 10-ную систему счисления?
еще вопрос - этот признак это просто бит? и где он храниться?
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
08.11.2010, 09:30 #29
Тут некоторые товарищи так уверенно утверждали, что в типе char 8 бит, однако в стандарте размер типа char не закреплен. У Страуструпа сказано только, что «практически всегда на объект типа char отводится 8 бит». Т.е. 8 бит нам никто не гарантировал.
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
08.11.2010, 10:22 #30
Цитата Сообщение от Mr.X Посмотреть сообщение
8 бит нам никто не гарантировал.
Mr.X, вот по этому Господь дал нам константу CHAR_BIT, определённую в файле limits.h или одном из его включённых файлов
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2010, 10:22
Привет! Вот еще темы с ответами:

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...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
08.11.2010, 10:22
Ответ Создать тему
Опции темы

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