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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 45, средняя оценка - 4.64
movsesiv
0 / 0 / 0
Регистрация: 28.08.2011
Сообщений: 9
#1

Разница между char и signed char - C++

06.07.2012, 18:34. Просмотров 6365. Ответов 22
Метки нет (Все метки)

Не понимаю в чем разница между char и signed char, ведь char по умолчанию знаковый.
Не комплилируется следующий фрагмент кода:
C++
1
2
3
4
5
6
void f(char&){}
int main(){
signed char sc;
f(sc);
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2012, 18:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разница между char и signed char (C++):

В чем разница между char* и char[]? - C++
Доброго времени суток, наткнулся на одну загвоздку есть такой кусок кода int _tmain(int argc, _TCHAR* argv) { char *a =...

В чем разница между char* и char ** - C++
в чем разница между char* и char ** ??

Разница между new char[] и new char[]() - C++
Доброго времени суток. Подскажите пожалуйста разницу, между следующим кодом: char* ch = new char; и char* ch = new...

Разница между char и int - C++
Известно что для чар выделяется 1 байт (8 бит) для инт 4 байта (32 бита). Так почему нельзя в чар присвоить 10 и больше до 255 в виде...

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

Тип char.Signed/unsigned.Отличие типов данных. - C++
Вопрос немного может быть не туда... Прошу прощения. Пишу прошивку к контроллеру, на С. Интересует отличие типов данных. ДОпустим есть тип...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
06.07.2012, 18:47 #2
Точно не определено, каким именно (знаковым или беззнаковым) должен быть тип char. Так что если он требуется для вычислений и принимает значения < 0 или > 127, следует указывать явно.

Фрагмент не компилируется из-за несоответствия типов.
movsesiv
0 / 0 / 0
Регистрация: 28.08.2011
Сообщений: 9
06.07.2012, 18:56  [ТС] #3
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Точно не определено, каким именно (знаковым или беззнаковым) должен быть тип char. Так что если он требуется для вычислений и принимает значения < 0 или > 127, следует указывать явно.

Фрагмент не компилируется из-за несоответствия типов.
Диапазон значений типа char (либо [-128, 127], либо [0, 255]) зависит от аппаратной реалзации, поэтому для компилятора signed char и char не одно и тоже. Я правильно понял? Или это от компилятора зависит?
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
06.07.2012, 19:44 #4
http://www.cyberforum.ru/blogs/18334/blog69.html
далее раздел 2

Добавлено через 1 минуту
А великий смысл по замыслу разработчиков, возможно, состоял в том, чтобы как-то хотя бы условно разделять типы для хранения целочисленных значений и типы для хранения символов
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
07.07.2012, 03:47 #5
В signed char 1 бит занимает знак, в unsigned char знака нет. Размер типа char 8 бит.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 08:33 #6
Цитата Сообщение от movsesiv Посмотреть сообщение
Или это от компилятора зависит?
От компилятора.
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
07.07.2012, 12:43 #7
Цитата Сообщение от alsav22 Посмотреть сообщение
От компилятора
От компилятора это НЕ зависит. Для Си++ "char" и "signed char" - это два разных типа. По стандарту языка
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
07.07.2012, 13:17 #8
при передаче значения по неконстантной ссылке должно быть точное совпадения типов, а, как объяснили выше, char, unsigned char и signed char -- это три разных типа, хоть они и одного размера. потому и не компилируется.
если передавать параметр в функцию по константной ссылке, то компилятор осуществит приведение типов и все скомпилируется.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 13:17 #9
Цитата Сообщение от Evg Посмотреть сообщение
От компилятора это НЕ зависит. Для Си++ "char" и "signed char" - это два разных типа. По стандарту языка
Прошу прощения. Не разобрался в вопросе. От компилятора зависит знаковый или беззнаковый char по умолчанию.
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
07.07.2012, 14:04 #10
Цитата Сообщение от alsav22 Посмотреть сообщение
От компилятора зависит знаковый или беззнаковый char по умолчанию
Ага. И, как правило, char является знаковым. Я как-то и ни разу не слышал про компиляторы, где char был бы беззнаковым
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 14:15 #11
У меня VS 2010 и char знаковый. Как-то я столкнулся с проблемой при обработке русских букв функциями из cctype. Судя по советам на этом форуме, получается, что такие компиляторы есть. У меня такое подозрение, что одним из них является VS 2008. Или это не так?
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
07.07.2012, 16:43 #12
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня такое подозрение, что одним из них является VS 2008
Сомневаюсь. У компиляторов есть опции, каким образом трактовать char, что чтобы по умолчанию был беззнаковым - для "нормальных" архитектур это маловероятно
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 17:38 #13
Цитата Сообщение от Evg Посмотреть сообщение
Сомневаюсь. У компиляторов есть опции, каким образом трактовать char, что чтобы по умолчанию был беззнаковым - для "нормальных" архитектур это маловероятно
Не пойму тогда, почему у него (у кого VS 2008) такой код при вводе русских букв работал:
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
#include <cctype>
 
int main()
{
    setlocale(0, "");
    char fam[20];
    int dl = 0, stop;
 
    do
    {
    stop = 0; 
    cout << "Введите фамилию:\n";
    cin >> fam;
    dl=strlen(fam);
    for ( int i = 0; i < dl; i++ )
    {
        if (isdigit(fam[i]));
        else stop++;
    }
    if (stop < dl) cout << "В фамилии не должно быть цифр. \n";
    } while(stop < dl);
    
    cout << endl;
    system("pause");
}
, а у меня выдавал ошибку. Если так:
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
#include <cctype>
 
int main()
{
    setlocale(0, "");
    char fam[20];
    int dl = 0, stop;
 
    do
    {
    stop = 0; 
    cout << "Введите фамилию:\n";
    cin >> fam;
    dl=strlen(fam);
    for ( int i = 0; i < dl; i++ )
    {
        if (isdigit((unsigned char)fam[i]));
        else stop++;
    }
    if (stop < dl) cout << "В фамилии не должно быть цифр. \n";
    } while(stop < dl);
    
    cout << endl;
    system("pause");
}
, то и у меня без ошибок?
Миниатюры
Разница между char и signed char  
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
07.07.2012, 17:46 #14
isdigit принимает в качестве аргумента int (не знаю, почему, кстати), и корректно работает с signed char только если signed char предварительно кастануть в unsigned char.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 18:38 #15
Цитата Сообщение от yekka Посмотреть сообщение
isdigit принимает в качестве аргумента int
Может я и ошибаюся, но мне кажется, что isdigit() нужен unsigned int и не больше 255. Если коды русских букв из знакового char привести к int, то получится отрицательное число. Если отрицательное привести к unsigned int, то больше 255, поэтому и сбой в isdigit().
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2012, 18:38
Привет! Вот еще темы с ответами:

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

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

char и char* разница - C++
Привет всем:) Изучаю С++ и вот застрял на задании где надо удалить символ из входного потока. В гугле нашел вот такое код( смотрите ниже...

Как понять следующую запись (signed char const ix(delta_x > 0) - (delta_x < 0)? - C++
Всем привет! В принципе, название говорит само за себя. Хотелось бы понять, почему используется такой синтаксис и что он вообще...


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

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

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