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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Контейнеры в Windows http://www.cyberforum.ru/cpp-beginners/thread48852.html
Привет.На лето в институте задавали как практику написать приложение с 2мя контейнерами.Мне попалось со списками.Так вот , условиям выбра во 2ой контейнер данных из 1го является - четность.А я убей не помню, как четные числа выводить...((Помогите плиз)
C++ Ошибка времени выполнения Я пишу проэкт в Visual Studia 2008 на C++. У меня есть несколько проблем. Во-первых, когда я собираю финальную версию (release) и запускаю не выполнение, то появляется ошибка: Unhandled exception at 0x00402330 in chtml.exe: 0xC0000005: Access violation reading location 0x00000000. вот в этом месте int main( int argv, char *argc ) { #if ! LINUX setlocale( LC_ALL, ".1251" ); #endif... http://www.cyberforum.ru/cpp-beginners/thread48827.html
C++ Массивы (С++)
Здраствуйте помогите решить задачку на С++, задача простая а обращаюсь к вам потомучто совсем не знаком с этим языком сформировать массив С из нечетных и массив К - из четных чисел последовательности N(m)={10, 8, 4, 3, 6, 15, 2}, m=7. заранее очень благодарен
подскажите мне соответствующую книгу C++
френды,вот в чем загвоздка я не люблю читать литературу с компа,например в форматах pdf или ещё хуже DJVU у меня просто не приспособлены для этого мозги...я люблю читать реальные книги на бумаге...это уже научно доказано,что такая литература лучше усваивается,нежели литература с компа я прочитал в бумажном варианте книгу Стивена Холзнера Самоучитель Visual c++.Учебный курс книга...
C++ Что означают параметры %d, %s, %f и т.д.? http://www.cyberforum.ru/cpp-beginners/thread48806.html
Появилась проблема с выводом переменных в MessageBox. В MSDN нарыл это: #include <stdio.h> int main( void ) { char buffer, s = "computer", c = 'l'; int i = 35, j; float fp = 1.7320534f;
C++ Задача "Кузнечик" Помогите решить в С++ задачу про цифрового кузнечика: имеется линейный массив из 20 чисел 1,2,3,4...20. По нём может прыгать кузнечик скачками по 2 и по 3 клетки. Нужно создать программку, которая считает сколько есть вариантов у кузнечика попасть из клетки 0 на клетку 20. Использовать цикл "for"... подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16838 / 5259 / 323
Регистрация: 30.03.2009
Сообщений: 14,157
Записей в блоге: 26
10.11.2010, 23:39     Тип char.Signed/unsigned.Отличие типов данных.
Цитата Сообщение от toxxin Посмотреть сообщение
Вопрос немного может быть не туда... Прошу прощения. Пишу прошивку к контроллеру, на С. Интересует отличие типов данных. ДОпустим есть тип char и тип unsigned char. Первый -128...127, а второй 0...255 соответственно. Оба типа занимают 8 бит. В чем разница?? Или разница в обработки типов библиотеками(к примеру) или правильном распозновании например кодировки ASCII ну и т.д. Интересует разница на битовом уровне. Т.е. по идее и там и там 8 бит..

Вопрос появился, когда мне необходимо было считать байт из регистра. Для этого я завел переменную(допустим t) типа char, считал байт. Если я правильно понимаю t фактически это тоже байт памяти, поэтому при считывании регистра в эту переменную t у меня все эти 8 бит просто дублируются. Вопрос что бы изменилось если бы я переменную обозначил типа unsigned char?? И вообще пишут что тип char это символ, а мне не очень понятно ГДЕ/ЧТО/КАК этот символ. И как СИМВОЛ отличается от типа ИНТЕДЖЕР например(кроме того что int - 16 бит)??
Тут много написано, я не стал читать.

В случае, если процессор работает с целыми числами в дополнительном коде (а это так для всех "нормальных" процессоров и для большинства специализированных), то разница между знаковым типом и беззнаковым только в трактовке величины. Т.е. битовое представление int и unsigned int ничем не отличается. При операции сложения знаковых или беззнаковых типов для одного и того же набора параметров (в битовом представлении) получим один и тот же результат. Таким же свойством обладают операции вычитания, умножения, все побитовые операции, операция сдвига влево. Знаковость критична для операций деления и операций сдвига вправо. Так же знаковость критична при целочисленном преобразовании к более широкому типу. Т.е. преобразования char->int и unsigned char->int в общем случае НЕ эквивалентны

Добавлено через 3 минуты
Цитата Сообщение от novi4ok Посмотреть сообщение
например:

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 тоже окажется равным нулю, что означает положительный результат, т.е. равно. в памяти - то же самое, но там где важен тип, будут различия.
Рассуждения неверные. По стандарту языка Си любые операции над типами короче int'а вызывают promotion: аргумент будет расширен до int'а и только потом произведётся арифметическая операция. Т.е. при записи "ch == uch" реально выполняется операция "(int)ch == (int)uch". Результат будет false потому, что операции расширения (преобразования от короткого типа к длинному) для знаковых и беззнаковых НЕ эквивалентны (а не потому, что знаковый и беззнаковый char отличаются)

Добавлено через 10 минут
Цитата Сообщение от norge_goth Посмотреть сообщение
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), то есть как он решает что в одном случае надо просто нули добавить слева, а в другом единицы?
Это и есть то, что я выше называл "операция расширения". Для обеих переменных 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 минут
Цитата Сообщение от st_dent Посмотреть сообщение
Вопрос как раз в том, что значит такое объявление, что это за тип - unsigned?
Некая фривольность языка Си. О том, какие типы как можно обозначать - см. Вопрос о типах данных С++

Добавлено через 48 секунд
Цитата Сообщение от st_dent Посмотреть сообщение
norge_goth, спасибо. а как заставить cout выводить unsigned char как не символ, а как число(аналог printf("%d", Bxbit1))?
C++
1
cout << (int)uch;
 
Текущее время: 15:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru