Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/120: Рейтинг темы: голосов - 120, средняя оценка - 4.82
касаткО
 Аватар для Jetu
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227

Signed/Unsigned

21.03.2012, 19:40. Показов 25207. Ответов 64
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Стал изучать ЯП C. Не совсем могу понять, что означает Signed и Unsigned (как я понял означает наличие знака(+ либо -) или его отсутствие). Не мог ли бы доходчиво объяснить, что это означает и в какой ситуации используется.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2012, 19:40
Ответы с готовыми решениями:

Сложение signed и unsigned
Известно что при сложении signed и unsigned будет результирующий тип unsigned. Подскажите пожалуйста правило согласно которому так будет...

Как перевести Unsigned в Signed
Есть функция, которая получает на вход char(число). Я хочу передать туда dword,но в результате получаю не то из-за знака. На входе...

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

64
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
21.03.2012, 20:03
Отличие в том, что один тип имеет знак ( -\+ ) а другой ( unsigned ) не имеет знака. Беззнаковые обычно используются для индексации или для определения размерности массивов, так же часто для счетчиков в циклах.
1
касаткО
 Аватар для Jetu
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:04  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
Отличие в том, что один тип имеет знак ( -\+ ) а другой ( unsigned ) не имеет знака. Беззнаковые обычно используются для индексации или для определения размерности массивов, так часто для счетчиков в циклах.
а привести пример вы не могли бы ?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
21.03.2012, 20:09
если у вас с элементарной математикой не безнадёжно, то думаю не надо объяснять разницу между целыми и целыми неотрицательными
1
касаткО
 Аватар для Jetu
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:11  [ТС]
Цитата Сообщение от retmas Посмотреть сообщение
если у вас с элементарной математикой не безнадёжно, то думаю не надо объяснять разницу между целыми и целыми неотрицательными
нет нет я понимаю разницу меня интересует как это писать в коде программы ?
я правильно думаю ?
C
1
unsigned int i
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
21.03.2012, 20:17
Да, все верно.
1
касаткО
 Аватар для Jetu
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:18  [ТС]
Спасибо вам большое
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
21.03.2012, 20:19
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
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
21.03.2012, 20:22
retmas, не все сразу.

Jetu, дело в том, что старший бит интерпретируется как знак, в знаковом числе (0 - положительное, 1 - отрицательное). Помня, что отрицательные числа хранятся в доп. коде, я думаю все станет понятно.
2
касаткО
 Аватар для Jetu
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:27  [ТС]
Цитата Сообщение от 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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.03.2012, 20:32
Цитата Сообщение от Jetu Посмотреть сообщение
Здравствуйте! Стал изучать ЯП C. Не совсем могу понять, что означает Signed и Unsigned (как я понял означает наличие знака(+ либо -) или его отсутствие). Не мог ли бы доходчиво объяснить, что это означает и в какой ситуации используется.
https://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)
{
  ...
}
2
касаткО
 Аватар для Jetu
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227
21.03.2012, 20:36  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
https://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
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
21.03.2012, 21:00
Evg, а как они различаются на знаковые и беззнаковые в уже скомпилированной программе?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.03.2012, 21:12
Цитата Сообщение от Toshkarik Посмотреть сообщение
Evg, а как они различаются на знаковые и беззнаковые в уже скомпилированной программе?
При хранении - никак. При использовании - в процессоре есть знаковые и беззнаковые операции. Например, для сравнения на меньше используется в одном случае операция "сравнить" и "переход если меньше знаково", а во втором случае - "сравнить" и "переход если меньше беззнаково"

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

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

Здесь надо оговориться, что это разделение сделано при условии, что аргументы операции имеют тот же размер, что и результат. На sparc'е, например, есть операция умножения двух 32-битных аргументов, которая формирует 64-битный результат. Операции такого типа уже зависят от знаковости (т.е. есть отдельная операция для знакового умножения и отдельная для беззнакового). Но при использовании любой из операций младшие 32 бита результат будут одинаковыми
3
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
21.03.2012, 21:27
Цитата Сообщение от Evg Посмотреть сообщение
Те, при исполнении которых знаковость не играет никакой роли
Цитата Сообщение от Evg Посмотреть сообщение
сравнения равно или не равно
То-есть при сравнении if ( a == b ) результат будет true? Или я немного недопонял?
И как процессор выбирает знаковую или беззнаковую операцию? Или это определяется при компилировании и просто программой вызывается нужна операция?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
21.03.2012, 21:48
Цитата Сообщение от Toshkarik Посмотреть сообщение
Evg, а как они различаются на знаковые и беззнаковые в уже скомпилированной программе?
При сравнение беззнаковые сравниваются, как выше, ниже и т.д.
Об этом знает процессор.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
21.03.2012, 21:54
go, если честно, вообще ничего не понял из Вашего сообщения. Выше и ниже чего? И откуда и что знает процессор?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.03.2012, 22:01
Цитата Сообщение от Toshkarik Посмотреть сообщение
То-есть при сравнении if ( a == b ) результат будет true? Или я немного недопонял?
Имелось в виду то, что при сравнении на равенство знаковых величин или беззнаковых величин используется одна и та же аппаратная операция. Но если сравнивать на меньше, то при сравнении знаковых величин будет использоваться одна аппаратная операция, а при сравнении беззнаковых - другая

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

Цитата Сообщение от Toshkarik Посмотреть сообщение
Или это определяется при компилировании и просто программой вызывается нужна операция?
Да. Только не "вызывается", а "выполняется"
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
21.03.2012, 22:03
Все понятно, спасибо.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
21.01.2021, 00:50
Цитата Сообщение от Evg Посмотреть сообщение
При использовании - в процессоре есть знаковые и беззнаковые операции.
На некоторых процессорах charможет занимать 0-255, если применить приставку signed то
char будет хранить от -128 до 127 или я не прав? Информацию о типах брал здесь https://metanit.com/cpp/tutorial/2.3.php у меня стандартные типы и char хранит от -128-127.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.01.2021, 00:50
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru