Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/140: Рейтинг темы: голосов - 140, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 28.08.2011
Сообщений: 9
1

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

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

Author24 — интернет-сервис помощи студентам
Не понимаю в чем разница между char и signed char, ведь char по умолчанию знаковый.
Не комплилируется следующий фрагмент кода:
C++
1
2
3
4
5
6
void f(char&){}
int main(){
signed char sc;
f(sc);
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2012, 18:34
Ответы с готовыми решениями:

Char unsigned char signed char длинна Кааак
Здравствуйте. char l = {0,0}; l = 0xff; Почему, меня, компилятор не посылает куда...

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

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

Разница между char[] и char*
Здравствуйте. Провожу небольшую иследовательскую работу по выяснении разницы между char и char*....

22
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
06.07.2012, 18:47 2
Точно не определено, каким именно (знаковым или беззнаковым) должен быть тип char. Так что если он требуется для вычислений и принимает значения < 0 или > 127, следует указывать явно.

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

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

Добавлено через 1 минуту
А великий смысл по замыслу разработчиков, возможно, состоял в том, чтобы как-то хотя бы условно разделять типы для хранения целочисленных значений и типы для хранения символов
0
387 / 214 / 102
Регистрация: 09.04.2012
Сообщений: 635
07.07.2012, 03:47 5
В signed char 1 бит занимает знак, в unsigned char знака нет. Размер типа char 8 бит.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 08:33 6
Цитата Сообщение от movsesiv Посмотреть сообщение
Или это от компилятора зависит?
От компилятора.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.07.2012, 12:43 7
Цитата Сообщение от alsav22 Посмотреть сообщение
От компилятора
От компилятора это НЕ зависит. Для Си++ "char" и "signed char" - это два разных типа. По стандарту языка
0
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
07.07.2012, 13:17 8
при передаче значения по неконстантной ссылке должно быть точное совпадения типов, а, как объяснили выше, char, unsigned char и signed char -- это три разных типа, хоть они и одного размера. потому и не компилируется.
если передавать параметр в функцию по константной ссылке, то компилятор осуществит приведение типов и все скомпилируется.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 13:17 9
Цитата Сообщение от Evg Посмотреть сообщение
От компилятора это НЕ зависит. Для Си++ "char" и "signed char" - это два разных типа. По стандарту языка
Прошу прощения. Не разобрался в вопросе. От компилятора зависит знаковый или беззнаковый char по умолчанию.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.07.2012, 14:04 10
Цитата Сообщение от alsav22 Посмотреть сообщение
От компилятора зависит знаковый или беззнаковый char по умолчанию
Ага. И, как правило, char является знаковым. Я как-то и ни разу не слышал про компиляторы, где char был бы беззнаковым
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 14:15 11
У меня VS 2010 и char знаковый. Как-то я столкнулся с проблемой при обработке русских букв функциями из cctype. Судя по советам на этом форуме, получается, что такие компиляторы есть. У меня такое подозрение, что одним из них является VS 2008. Или это не так?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.07.2012, 16:43 12
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня такое подозрение, что одним из них является VS 2008
Сомневаюсь. У компиляторов есть опции, каким образом трактовать char, что чтобы по умолчанию был беззнаковым - для "нормальных" архитектур это маловероятно
0
5498 / 4893 / 831
Регистрация: 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  
0
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
07.07.2012, 17:46 14
isdigit принимает в качестве аргумента int (не знаю, почему, кстати), и корректно работает с signed char только если signed char предварительно кастануть в unsigned char.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 18:38 15
Цитата Сообщение от yekka Посмотреть сообщение
isdigit принимает в качестве аргумента int
Может я и ошибаюся, но мне кажется, что isdigit() нужен unsigned int и не больше 255. Если коды русских букв из знакового char привести к int, то получится отрицательное число. Если отрицательное привести к unsigned int, то больше 255, поэтому и сбой в isdigit().
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.07.2012, 20:01 16
Цитата Сообщение от alsav22 Посмотреть сообщение
Может я и ошибаюся, но мне кажется, что isdigit() нужен unsigned int и не больше 255
В спецификации написано, что параметр типа int. Т.е. значения от 0 до 255. А потому для знакового char'а при таком раскладе должно каосячить
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2012, 04:20 17
Цитата Сообщение от Evg Посмотреть сообщение
параметр типа int. Т.е. значения от 0 до 255
Вот этого не понимаю! Разве int - это от 0 до 255?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
08.07.2012, 10:29 18
Цитата Сообщение от alsav22 Посмотреть сообщение
Разве int - это от 0 до 255?
А с учётом всяких юникодов разве диапазон входных значений от 0 до 255?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2012, 10:36 19
Цитата Сообщение от Evg Посмотреть сообщение
А с учётом всяких юникодов разве диапазон входных значений от 0 до 255?
Я не про Юникод, а про int и isdigit().
В спецификации написано, что параметр типа int. Т.е. значения от 0 до 255.
Зачем int, если isdigit() может обработать только от 0 до 255? Почему не написать в спецификации, что параметр типа unsigned char?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
08.07.2012, 10:50 20
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему не написать в спецификации, что параметр типа unsigned char?
Напиши. Я тебе объяснил возможную логику, которой руководствовались те, кто это дело проектировал. А сейчас махать руками и кричать "почему сделали так, а не эдак" никакого смысла не имеет. Я со всякими юникодами и прочими не работал, но, возможно, что эти интерфейсы и сейчас воспринимают больше, чем диапазон от 0 до 255

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

Надо это немного вкурить и понять, оно уже включает в себя всякие расширенные кодировки или нет
1
08.07.2012, 10:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2012, 10:50
Помогаю со студенческими работами здесь

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

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

Signed Char -> Int
Есть следующий код: int i = 128; char c = i; int ii = c; Почему в c оказывается -128 я...

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

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

Выполнить операции для переменных типа signed char
Выполнить операции: а) 5+127; б) 2-3; в) -120-34; г) (unsigned char)(-5); д) 56 &amp; 38; е)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru