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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 45, средняя оценка - 4.64
movsesiv
 Аватар для movsesiv
0 / 0 / 0
Регистрация: 28.08.2011
Сообщений: 9
06.07.2012, 18:34     Разница между char и signed char #1
Не понимаю в чем разница между char и signed char, ведь char по умолчанию знаковый.
Не комплилируется следующий фрагмент кода:
C++
1
2
3
4
5
6
void f(char&){}
int main(){
signed char sc;
f(sc);
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
06.07.2012, 18:47     Разница между char и signed char #2
Точно не определено, каким именно (знаковым или беззнаковым) должен быть тип char. Так что если он требуется для вычислений и принимает значения < 0 или > 127, следует указывать явно.

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

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

Добавлено через 1 минуту
А великий смысл по замыслу разработчиков, возможно, состоял в том, чтобы как-то хотя бы условно разделять типы для хранения целочисленных значений и типы для хранения символов
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
07.07.2012, 03:47     Разница между char и signed char #5
В signed char 1 бит занимает знак, в unsigned char знака нет. Размер типа char 8 бит.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 08:33     Разница между char и signed char #6
Цитата Сообщение от movsesiv Посмотреть сообщение
Или это от компилятора зависит?
От компилятора.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
07.07.2012, 12:43     Разница между char и signed char #7
Цитата Сообщение от alsav22 Посмотреть сообщение
От компилятора
От компилятора это НЕ зависит. Для Си++ "char" и "signed char" - это два разных типа. По стандарту языка
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
07.07.2012, 13:17     Разница между char и signed char #8
при передаче значения по неконстантной ссылке должно быть точное совпадения типов, а, как объяснили выше, char, unsigned char и signed char -- это три разных типа, хоть они и одного размера. потому и не компилируется.
если передавать параметр в функцию по константной ссылке, то компилятор осуществит приведение типов и все скомпилируется.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 13:17     Разница между char и signed char #9
Цитата Сообщение от Evg Посмотреть сообщение
От компилятора это НЕ зависит. Для Си++ "char" и "signed char" - это два разных типа. По стандарту языка
Прошу прощения. Не разобрался в вопросе. От компилятора зависит знаковый или беззнаковый char по умолчанию.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
07.07.2012, 14:04     Разница между char и signed char #10
Цитата Сообщение от alsav22 Посмотреть сообщение
От компилятора зависит знаковый или беззнаковый char по умолчанию
Ага. И, как правило, char является знаковым. Я как-то и ни разу не слышал про компиляторы, где char был бы беззнаковым
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 14:15     Разница между char и signed char #11
У меня VS 2010 и char знаковый. Как-то я столкнулся с проблемой при обработке русских букв функциями из cctype. Судя по советам на этом форуме, получается, что такие компиляторы есть. У меня такое подозрение, что одним из них является VS 2008. Или это не так?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
07.07.2012, 16:43     Разница между char и signed char #12
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня такое подозрение, что одним из них является VS 2008
Сомневаюсь. У компиляторов есть опции, каким образом трактовать char, что чтобы по умолчанию был беззнаковым - для "нормальных" архитектур это маловероятно
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 17:38     Разница между char и signed char #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
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
07.07.2012, 17:46     Разница между char и signed char #14
isdigit принимает в качестве аргумента int (не знаю, почему, кстати), и корректно работает с signed char только если signed char предварительно кастануть в unsigned char.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 18:38     Разница между char и signed char #15
Цитата Сообщение от yekka Посмотреть сообщение
isdigit принимает в качестве аргумента int
Может я и ошибаюся, но мне кажется, что isdigit() нужен unsigned int и не больше 255. Если коды русских букв из знакового char привести к int, то получится отрицательное число. Если отрицательное привести к unsigned int, то больше 255, поэтому и сбой в isdigit().
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
07.07.2012, 20:01     Разница между char и signed char #16
Цитата Сообщение от alsav22 Посмотреть сообщение
Может я и ошибаюся, но мне кажется, что isdigit() нужен unsigned int и не больше 255
В спецификации написано, что параметр типа int. Т.е. значения от 0 до 255. А потому для знакового char'а при таком раскладе должно каосячить
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2012, 04:20     Разница между char и signed char #17
Цитата Сообщение от Evg Посмотреть сообщение
параметр типа int. Т.е. значения от 0 до 255
Вот этого не понимаю! Разве int - это от 0 до 255?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
08.07.2012, 10:29     Разница между char и signed char #18
Цитата Сообщение от alsav22 Посмотреть сообщение
Разве int - это от 0 до 255?
А с учётом всяких юникодов разве диапазон входных значений от 0 до 255?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2012, 10:36     Разница между char и signed char #19
Цитата Сообщение от Evg Посмотреть сообщение
А с учётом всяких юникодов разве диапазон входных значений от 0 до 255?
Я не про Юникод, а про int и isdigit().
В спецификации написано, что параметр типа int. Т.е. значения от 0 до 255.
Зачем int, если isdigit() может обработать только от 0 до 255? Почему не написать в спецификации, что параметр типа unsigned char?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2012, 10:50     Разница между char и signed char
Еще ссылки по теме:

C++ В чем разница между char* и char[]?
C++ Разница между char и int
В чем разница между char* и char ** C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
08.07.2012, 10:50     Разница между char и signed char #20
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему не написать в спецификации, что параметр типа unsigned char?
Напиши. Я тебе объяснил возможную логику, которой руководствовались те, кто это дело проектировал. А сейчас махать руками и кричать "почему сделали так, а не эдак" никакого смысла не имеет. Я со всякими юникодами и прочими не работал, но, возможно, что эти интерфейсы и сейчас воспринимают больше, чем диапазон от 0 до 255

Добавлено через 5 минут
Как оно в glibc реализовано - см. тут
http://sourceware.org/git/?p=glibc.g...b04ea4;hb=HEAD

Надо это немного вкурить и понять, оно уже включает в себя всякие расширенные кодировки или нет
Yandex
Объявления
08.07.2012, 10:50     Разница между char и signed char
Ответ Создать тему
Опции темы

Текущее время: 19:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru