Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.88
Jetu
касаткО
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
#1

Signed/Unsigned - C++

21.03.2012, 19:40. Просмотров 4880. Ответов 18
Метки нет (Все метки)

Здравствуйте! Стал изучать ЯП C. Не совсем могу понять, что означает Signed и Unsigned (как я понял означает наличие знака(+ либо -) или его отсутствие). Не мог ли бы доходчиво объяснить, что это означает и в какой ситуации используется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2012, 19:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Signed/Unsigned (C++):

Сравнение чисел unsigned и signed - C++
Результат: 60000 и -5536. По какому принципу выводится значение, если заданное число выходит из диапазона, как в коде? Диапазоны:...

Comparison between signed and unsigned integer expressions - C++
Много вот таких варнингов: Comparison between signed and unsigned integer expressions FreeBSD 10 gcc 4.8 Ввожу:gmake libthecore...

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

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

[C++ Warning] Unit1.cpp(24): W8012 Comparing signed and unsigned values - C++
Код : #include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> using namespace std; ...

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

18
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
21.03.2012, 20:03 #2
Отличие в том, что один тип имеет знак ( -\+ ) а другой ( unsigned ) не имеет знака. Беззнаковые обычно используются для индексации или для определения размерности массивов, так же часто для счетчиков в циклах.
1
Jetu
касаткО
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:04  [ТС] #3
Цитата Сообщение от Toshkarik Посмотреть сообщение
Отличие в том, что один тип имеет знак ( -\+ ) а другой ( unsigned ) не имеет знака. Беззнаковые обычно используются для индексации или для определения размерности массивов, так часто для счетчиков в циклах.
а привести пример вы не могли бы ?
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
21.03.2012, 20:09 #4
если у вас с элементарной математикой не безнадёжно, то думаю не надо объяснять разницу между целыми и целыми неотрицательными
1
Jetu
касаткО
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:11  [ТС] #5
Цитата Сообщение от retmas Посмотреть сообщение
если у вас с элементарной математикой не безнадёжно, то думаю не надо объяснять разницу между целыми и целыми неотрицательными
нет нет я понимаю разницу меня интересует как это писать в коде программы ?
я правильно думаю ?
C
1
unsigned int i
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
21.03.2012, 20:17 #6
Да, все верно.
1
Jetu
касаткО
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:18  [ТС] #7
Спасибо вам большое
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
21.03.2012, 20:19 #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 Посмотреть сообщение
я правильно думаю ?
да, но зачем гадать? думаю, в вашей книжке это написано
1
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.03.2012, 20:22 #9
retmas, не все сразу.

Jetu, дело в том, что старший бит интерпретируется как знак, в знаковом числе (0 - положительное, 1 - отрицательное). Помня, что отрицательные числа хранятся в доп. коде, я думаю все станет понятно.
1
Jetu
касаткО
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:27  [ТС] #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;
да, но зачем гадать? думаю, в вашей книжке это написано
там написано об этом вскользь и не совсем был не понятен синтаксис
спасибо что помогли
0
Evg
Эксперт CАвтор FAQ
18253 / 6378 / 438
Регистрация: 30.03.2009
Сообщений: 17,656
Записей в блоге: 28
21.03.2012, 20:32 #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)
{
  ...
}
1
Jetu
касаткО
51 / 51 / 1
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:36  [ТС] #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)
{
  ...
}
Огромное спасибо за ссылку на таблицу и за доходчивое объяснение )
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
21.03.2012, 21:00 #13
Evg, а как они различаются на знаковые и беззнаковые в уже скомпилированной программе?
0
Evg
Эксперт CАвтор FAQ
18253 / 6378 / 438
Регистрация: 30.03.2009
Сообщений: 17,656
Записей в блоге: 28
21.03.2012, 21:12 #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Evg, а как они различаются на знаковые и беззнаковые в уже скомпилированной программе?
При хранении - никак. При использовании - в процессоре есть знаковые и беззнаковые операции. Например, для сравнения на меньше используется в одном случае операция "сравнить" и "переход если меньше знаково", а во втором случае - "сравнить" и "переход если меньше беззнаково"

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

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

Здесь надо оговориться, что это разделение сделано при условии, что аргументы операции имеют тот же размер, что и результат. На sparc'е, например, есть операция умножения двух 32-битных аргументов, которая формирует 64-битный результат. Операции такого типа уже зависят от знаковости (т.е. есть отдельная операция для знакового умножения и отдельная для беззнакового). Но при использовании любой из операций младшие 32 бита результат будут одинаковыми
1
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
21.03.2012, 21:27 #15
Цитата Сообщение от Evg Посмотреть сообщение
Те, при исполнении которых знаковость не играет никакой роли
Цитата Сообщение от Evg Посмотреть сообщение
сравнения равно или не равно
То-есть при сравнении if ( a == b ) результат будет true? Или я немного недопонял?
И как процессор выбирает знаковую или беззнаковую операцию? Или это определяется при компилировании и просто программой вызывается нужна операция?
0
21.03.2012, 21:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2012, 21:27
Привет! Вот еще темы с ответами:

Почему выскакивает Warning "signed/unsigned mismatch"? - C++
Написал такую программу, в которой перегружена функция rev_str(). Впринципе программа компилируется и работает нормально. Но волнует то,...

Unary minus operator applied to unsigned type, result still unsigned - C++
Подскажите, имеем следующий код: signed int a = -0x80000000; signed int b = -1; signed int c = (a / b);

Приведение типов unsigned char[2] to unsigned char [64] - C++
Добрый день! Подскажите пожалуйста, как поступить. Есть простая функция main int main() { SHA1Context sha; uint8_t...

Не понятный undefined reference to `unsigned long long f<unsigned long long, void> - C++
test.cpp: #include &lt;iostream&gt; template &lt;typename FormalType, typename FactType = typename std::enable_if&lt;std::is_same&lt;FormalType,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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