0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
|
|
1 | |
Тип char.Signed/unsigned.Отличие типов данных.30.08.2009, 22:17. Показов 34758. Ответов 51
Метки нет (Все метки)
Вопрос немного может быть не туда... Прошу прощения. Пишу прошивку к контроллеру, на С. Интересует отличие типов данных. ДОпустим есть тип char и тип unsigned char. Первый -128...127, а второй 0...255 соответственно. Оба типа занимают 8 бит. В чем разница?? Или разница в обработки типов библиотеками(к примеру) или правильном распозновании например кодировки ASCII ну и т.д. Интересует разница на битовом уровне. Т.е. по идее и там и там 8 бит..
Вопрос появился, когда мне необходимо было считать байт из регистра. Для этого я завел переменную(допустим t) типа char, считал байт. Если я правильно понимаю t фактически это тоже байт памяти, поэтому при считывании регистра в эту переменную t у меня все эти 8 бит просто дублируются. Вопрос что бы изменилось если бы я переменную обозначил типа unsigned char?? И вообще пишут что тип char это символ, а мне не очень понятно ГДЕ/ЧТО/КАК этот символ. И как СИМВОЛ отличается от типа ИНТЕДЖЕР например(кроме того что int - 16 бит)??
0
|
30.08.2009, 22:17 | |
Ответы с готовыми решениями:
51
Значения типов данных (signed, unsigned, char) Char unsigned char signed char длинна Кааак Надо перевести переменную типа unsigned char* в signed int и обратно Приведение типов unsigned char[2] to unsigned char [64] |
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
|
|
10.11.2010, 19:59 | 41 |
битовые поля
объявлена переменная (Bxbit1) типа (unsigned char) размером 1 бит(:1). при таком объявлении cout выводит символ, а вот если объявить unsigned Bxbit1:1, то выводить будет код символа(точнее, числовое значение переменной:1 или 0, что и нужно в данном случае). Вопрос как раз в том, что значит такое объявление, что это за тип - unsigned?
1
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
|
10.11.2010, 20:03 | 42 |
без знаковый это значит что в одном байте можно поместить от 0 до 255 значение, то есть он содержит только натуральные числа(не отрицательные), signed напротив -127..128
1111 1111 = 255(unsigned) 1111 1111 = -1 (signed) вообще unsigned это не тип а модификатор типа может быть unsigned int, unsigned char, unsigned double а если просто как в вашем объявлении то под unsigned подразумеваеться неявно unsigned int(то есть число, а не символ для cout), тоже было бы если б вы объявили просто short или long
0
|
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
|
|||||||||||
10.11.2010, 20:08 | 43 | ||||||||||
norge_goth, спасибо, но это понятно.
объявление знакового/без знакового:
0
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
|
10.11.2010, 20:10 | 44 |
0
|
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
|
|
10.11.2010, 20:13 | 45 |
norge_goth, в таком случае почему код, приведенный выше, при объявлении по разному дает разный результат, если такие объявления эквивалентны?
0
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
||||||
10.11.2010, 20:21 | 46 | |||||
вы имеете ввиду почему
(1) cout выводит как чар(символ) Си-еквивалент printf("%c", Bxbit1) (2) cout выводит как unsigned int(число) Си-еквивалент printf("%d", Bxbit1)
1
|
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
|
|
10.11.2010, 20:48 | 47 |
norge_goth, спасибо. а как заставить cout выводить unsigned char как не символ, а как число(аналог printf("%d", Bxbit1))?
0
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
||||||||||||||||
10.11.2010, 21:17 | 48 | |||||||||||||||
По моему есть четыре способа вывести код чара:
1. Использовать тот же printf("%d", Bxbit1) в С++ никто не запрещает 2. Перегрузить cout, не разу не делал но предполагаю что можно аля:
3. Определить ф-ции типа myCout
4. использовать оператор приведения типов перед выводом:
намой взгляд оптимальный вариант 3. и 4. для 3. и 2. варианта можно даже переопределить операторы << чтоб было как в стандартном но эт уже по геморойней
1
|
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
|
|
10.11.2010, 21:41 | 49 |
norge_goth,
спасибо, последний вариант - оптимальный!
0
|
10.11.2010, 23:39 | 50 | |||||
Сообщение было отмечено как решение
Решение
Тут много написано, я не стал читать.
В случае, если процессор работает с целыми числами в дополнительном коде (а это так для всех "нормальных" процессоров и для большинства специализированных), то разница между знаковым типом и беззнаковым только в трактовке величины. Т.е. битовое представление int и unsigned int ничем не отличается. При операции сложения знаковых или беззнаковых типов для одного и того же набора параметров (в битовом представлении) получим один и тот же результат. Таким же свойством обладают операции вычитания, умножения, все побитовые операции, операция сдвига влево. Знаковость критична для операций деления и операций сдвига вправо. Так же знаковость критична при целочисленном преобразовании к более широкому типу. Т.е. преобразования char->int и unsigned char->int в общем случае НЕ эквивалентны Добавлено через 3 минуты Рассуждения неверные. По стандарту языка Си любые операции над типами короче int'а вызывают promotion: аргумент будет расширен до int'а и только потом произведётся арифметическая операция. Т.е. при записи "ch == uch" реально выполняется операция "(int)ch == (int)uch". Результат будет false потому, что операции расширения (преобразования от короткого типа к длинному) для знаковых и беззнаковых НЕ эквивалентны (а не потому, что знаковый и беззнаковый char отличаются) Добавлено через 10 минут Это и есть то, что я выше называл "операция расширения". Для обеих переменных ch и uch мы имеем одно и то же битовое представление. Но при преобразовании к int'у используются различные операции: "знаковое расширение" и "беззнаковое расширение". Применительно к нашему примеру в первом случае знаковый (седьмой) бит значения распространяется на всю старшую часть, появившуюся при расширении: т.е. биты с 8 по 31 становятся равными 7-му биту ("знаковое расширение 8->32"). А во втором случае биты с 8 по 31 заполняются нулями ("беззнаковое расширение 8->32"). Знаковость расширения определяется знаковостью SRC-аргумента (но не dst). Т.е. преобразования "char->int" и "char->unsigned int" эквивалентны (поскольку в обоих случаях один и то же src-тип), а "char->int и unsigned char->int" НЕ эквивалентны (src-тип разный) Добавлено через 8 минут Некая фривольность языка Си. О том, какие типы как можно обозначать - см. Вопрос о типах данных С++ Добавлено через 48 секунд
3
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
||||||
11.11.2010, 00:05 | 51 | |||||
вы имеете ввиду операции сравнения? например
0
|
11.11.2010, 15:13 | 52 |
norge_goth, имелись в виду арифметические операции и сравнения. В операции присваивания преобразование не нужно, потому как там делается копирование значения. А в арифметических операциях и сравнениях как бы делается "трактовка значения", т.е. некое виртуальное преобразование битового набора, загруженного из памяти, в некоторое "число", над которым можно производить действия.
0
|
11.11.2010, 15:13 | |
11.11.2010, 15:13 | |
Помогаю со студенческими работами здесь
52
8-битовый тип signed char может представлять значения от -128 до 127 Signed/Unsigned Сложение signed и unsigned Сравнение чисел unsigned и signed Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |