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

Signed/Unsigned - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.88
Jetu
касаткО
 Аватар для Jetu
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 19:40     Signed/Unsigned #1
Здравствуйте! Стал изучать ЯП C. Не совсем могу понять, что означает Signed и Unsigned (как я понял означает наличие знака(+ либо -) или его отсутствие). Не мог ли бы доходчиво объяснить, что это означает и в какой ситуации используется.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.03.2012, 20:03     Signed/Unsigned #2
Отличие в том, что один тип имеет знак ( -\+ ) а другой ( unsigned ) не имеет знака. Беззнаковые обычно используются для индексации или для определения размерности массивов, так же часто для счетчиков в циклах.
Jetu
касаткО
 Аватар для Jetu
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:04  [ТС]     Signed/Unsigned #3
Цитата Сообщение от Toshkarik Посмотреть сообщение
Отличие в том, что один тип имеет знак ( -\+ ) а другой ( unsigned ) не имеет знака. Беззнаковые обычно используются для индексации или для определения размерности массивов, так часто для счетчиков в циклах.
а привести пример вы не могли бы ?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
21.03.2012, 20:09     Signed/Unsigned #4
если у вас с элементарной математикой не безнадёжно, то думаю не надо объяснять разницу между целыми и целыми неотрицательными
Jetu
касаткО
 Аватар для Jetu
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:11  [ТС]     Signed/Unsigned #5
Цитата Сообщение от retmas Посмотреть сообщение
если у вас с элементарной математикой не безнадёжно, то думаю не надо объяснять разницу между целыми и целыми неотрицательными
нет нет я понимаю разницу меня интересует как это писать в коде программы ?
я правильно думаю ?
C
1
unsigned int i
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.03.2012, 20:17     Signed/Unsigned #6
Да, все верно.
Jetu
касаткО
 Аватар для Jetu
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:18  [ТС]     Signed/Unsigned #7
Спасибо вам большое
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
21.03.2012, 20:19     Signed/Unsigned #8
C
1
2
3
4
unsigned char c;
unsigned short s; /* unsigned short int s; то же самое */
unsigned int i; /* unsigned i; то же самое */
unsigned long l;
Цитата Сообщение от Jetu Посмотреть сообщение
я правильно думаю ?
да, но зачем гадать? думаю, в вашей книжке это написано
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.03.2012, 20:22     Signed/Unsigned #9
retmas, не все сразу.

Jetu, дело в том, что старший бит интерпретируется как знак, в знаковом числе (0 - положительное, 1 - отрицательное). Помня, что отрицательные числа хранятся в доп. коде, я думаю все станет понятно.
Jetu
касаткО
 Аватар для Jetu
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:27  [ТС]     Signed/Unsigned #10
Цитата Сообщение от retmas Посмотреть сообщение
C
1
2
3
4
unsigned char c;
unsigned short s; /* unsigned short int s; то же самое */
unsigned int i; /* unsigned i; то же самое */
unsigned long l;
да, но зачем гадать? думаю, в вашей книжке это написано
там написано об этом вскользь и не совсем был не понятен синтаксис
спасибо что помогли
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
21.03.2012, 20:32     Signed/Unsigned #11
Цитата Сообщение от Jetu Посмотреть сообщение
Здравствуйте! Стал изучать ЯП C. Не совсем могу понять, что означает Signed и Unsigned (как я понял означает наличие знака(+ либо -) или его отсутствие). Не мог ли бы доходчиво объяснить, что это означает и в какой ситуации используется.
http://www.cyberforum.ru/blogs/18334/blog69.html

Знаковость и беззнаковость означает примерно следующее. Целочисленная переменная занимает в памяти столько-то бит. И эти биты можно трактовать двояко. Либо это беззнаковая величина, и тогда она будет лежать в диапазоне от нуля до +дофига, либо это знаковая величина, и тогда она будет лежать в диапазоне от -дофига/2 до +дофига/2.

Например. Возьмём 32 бита и заполним их единичками. Если данную переменную мы будем трактовать как знаковую, то значение переменной будет равно -1. Но если этот же самый набор битов мы будем трактовать как беззнаковую переменную, то её значение будет равно 4.294.967.295

При компиляции следующих двух строк получится абсолютно одинаковый машинный код:

C
1
2
3
int a = -1;
 
unsigned b = 4294967295u;
Но два последующих кода дадут разный результат сравнения:

C
1
2
3
4
5
6
7
8
9
if (a < 0)
{
  ...
}
 
if (b < 0)
{
  ...
}
Jetu
касаткО
 Аватар для Jetu
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:36  [ТС]     Signed/Unsigned #12
Цитата Сообщение от Evg Посмотреть сообщение
http://www.cyberforum.ru/blogs/18334/blog69.html

Знаковость и беззнаковость означает примерно следующее. Целочисленная переменная занимает в памяти столько-то бит. И эти биты можно трактовать двояко. Либо это беззнаковая величина, и тогда она будет лежать в диапазоне от нуля до +дофига, либо это знаковая величина, и тогда она будет лежать в диапазоне от -дофига/2 до +дофига/2.

Например. Возьмём 32 бита и заполним их единичками. Если данную переменную мы будем трактовать как знаковую, то значение переменной будет равно -1. Но если этот же самый набор битов мы будем трактовать как беззнаковую переменную, то её значение будет равно 4.294.967.295

При компиляции следующих двух строк получится абсолютно одинаковый машинный код:

C
1
2
3
int a = -1;
 
unsigned b = 4294967295u;
Но два последующих кода дадут разный результат сравнения:

C
1
2
3
4
5
6
7
8
9
if (a < 0)
{
  ...
}
 
if (b < 0)
{
  ...
}
Огромное спасибо за ссылку на таблицу и за доходчивое объяснение )
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.03.2012, 21:00     Signed/Unsigned #13
Evg, а как они различаются на знаковые и беззнаковые в уже скомпилированной программе?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
21.03.2012, 21:12     Signed/Unsigned #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Evg, а как они различаются на знаковые и беззнаковые в уже скомпилированной программе?
При хранении - никак. При использовании - в процессоре есть знаковые и беззнаковые операции. Например, для сравнения на меньше используется в одном случае операция "сравнить" и "переход если меньше знаково", а во втором случае - "сравнить" и "переход если меньше беззнаково"

Но при сложении, знаковые и беззнаковые типы вообще никак не отличаются. Это является свойством хранения чисел в двоичном виде в дополнительном коде. Другими словами, если сложить -1 + 1 и если сложить 4294967295 + 1, то получится одно и то же значение (ноль).

Таким образом, целочисленные операции условно можно разбить на две группы:
1. Те, при исполнении которых знаковость не играет никакой роли: сложение, вычитание, умножение, and, or, not, xor, сдвиг влево, сравнения равно или не равно. Аппаратно как правило есть только одна операция (в том смысле, что не зависящая от знаковости).
2. Те, при исполнении которых знаковость имеет значение: деление, остаток от деления, сдвиг вправо, сравнения меньше, больше, меньше или равно, больше или равно. Аппаратно как правило есть только две операции (знаковая и беззнаковая).

Здесь надо оговориться, что это разделение сделано при условии, что аргументы операции имеют тот же размер, что и результат. На sparc'е, например, есть операция умножения двух 32-битных аргументов, которая формирует 64-битный результат. Операции такого типа уже зависят от знаковости (т.е. есть отдельная операция для знакового умножения и отдельная для беззнакового). Но при использовании любой из операций младшие 32 бита результат будут одинаковыми
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.03.2012, 21:27     Signed/Unsigned #15
Цитата Сообщение от Evg Посмотреть сообщение
Те, при исполнении которых знаковость не играет никакой роли
Цитата Сообщение от Evg Посмотреть сообщение
сравнения равно или не равно
То-есть при сравнении if ( a == b ) результат будет true? Или я немного недопонял?
И как процессор выбирает знаковую или беззнаковую операцию? Или это определяется при компилировании и просто программой вызывается нужна операция?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.03.2012, 21:48     Signed/Unsigned #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
Evg, а как они различаются на знаковые и беззнаковые в уже скомпилированной программе?
При сравнение беззнаковые сравниваются, как выше, ниже и т.д.
Об этом знает процессор.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.03.2012, 21:54     Signed/Unsigned #17
go, если честно, вообще ничего не понял из Вашего сообщения. Выше и ниже чего? И откуда и что знает процессор?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
21.03.2012, 22:01     Signed/Unsigned #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
То-есть при сравнении if ( a == b ) результат будет true? Или я немного недопонял?
Имелось в виду то, что при сравнении на равенство знаковых величин или беззнаковых величин используется одна и та же аппаратная операция. Но если сравнивать на меньше, то при сравнении знаковых величин будет использоваться одна аппаратная операция, а при сравнении беззнаковых - другая

Цитата Сообщение от Toshkarik Посмотреть сообщение
И как процессор выбирает знаковую или беззнаковую операцию?
Выбирает не процессор, а компилятор. Компилятор видит твой исходник и знает о типах твоих переменных

Цитата Сообщение от Toshkarik Посмотреть сообщение
Или это определяется при компилировании и просто программой вызывается нужна операция?
Да. Только не "вызывается", а "выполняется"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2012, 22:03     Signed/Unsigned
Еще ссылки по теме:

Unary minus operator applied to unsigned type, result still unsigned C++
C++ Comparison between signed and unsigned integer expressions
C++ Приведение типов unsigned char[2] to unsigned char [64]

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.03.2012, 22:03     Signed/Unsigned #19
Все понятно, спасибо.
Yandex
Объявления
21.03.2012, 22:03     Signed/Unsigned
Ответ Создать тему
Опции темы

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