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

Signed/Unsigned

21.03.2012, 19:40. Показов 26331. Ответов 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
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
21.01.2021, 18:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Nexi99 Посмотреть сообщение
На некоторых процессорах charможет занимать 0-255, если применить приставку signed то
char будет хранить от -128 до 127 или я не прав?
К процессору это отношения не имеет. То, что ты говоришь - это настройка конкретного компилятора. Есть три разных типа: signed char, unsigned char, char. Тип char в зависимости от компилятора являет либо эквивалентом signed char, либо эквивалентом unsigned char. На большинстве компиляторов char по умолчанию является эквивалентом signed char. Но, судя по всему, есть компиляторы, где char по умолчанию является эквивалентом unsigned char

Формулировки типа "может хранить от -128 до +127" и "может хранить от 0 до 255" - это условно "формулировки для начинающих". Реальную суть я уже объяснил в посте #14. Хоть signed char, хоть unsigned char представляет собой кусок памяти размером 8 бит. Один от другого не отличается вообще ничем. Разница появляется только после того, как эти 8 бит подают в машинную операцию. Потому как некоторые операции будут трактовать эти 8 бит как знаковые, а некоторые - как беззнаковые
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
21.01.2021, 22:17
Цитата Сообщение от Evg Посмотреть сообщение
char по умолчанию является эквивалентом signed char
Значит signed char или char выдадут -128 до 127. Получается что даже если и написать signed char никакой нагрузке в принципе не будет. Какова вероятность нарваться когда простой char выдаст от 0 до 255? Это хреново что компиляторы так по разному реагируют придётся лишний код громодить.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
21.01.2021, 23:11
Цитата Сообщение от Nexi99 Посмотреть сообщение
Какова вероятность нарваться когда простой char выдаст от 0 до 255?
Nexi99, меняться может в пределах одного компилятора.
https://rextester.com/USN62227
https://rextester.com/KDYV60741
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
21.01.2021, 23:13
У многих компиляторов есть настройка знаковости char
Code
1
/J использовать по умолчанию unsigned для типа char
Code
1
2
  -fsigned-char               Make "char" signed by default.
  -funsigned-char             Make "char" unsigned by default.
"Просто" char - тот, который выбрали разработчики компилятора из тех или иных соображений, и это тип char'овых литералов без дополнительных префиксов.
Если Вам точно нужен signed char или unsigned char(напр. для представления маленьких чисел), эти типы и используйте.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
22.01.2021, 00:15
Цитата Сообщение от politoto Посмотреть сообщение
У многих компиляторов есть настройка знаковости char
Я про это не знал.

Добавлено через 13 минут
Что быстрее char или bool. С одной стороны bool может хранить только 0 и 1, по сути bool должен читать 1 бит, для того чтобы его прочитать возможно вызывается функция что вызывает нагрузку потому что в стандартном режиме считывается 1 байт т.е. 8 бит, если взять тип char то нагрузку может вызвать то что иногда мы требуем от него вернуть символ и тут тоже может вызываться функция, а иногда записываем число и в этом случае считывается 1 байт-т.е. 8 бит но функция может не вызываться. Я не смотрел как они это зашили может они в обоих случаях кипитят регистры процессора и нагрузка одинакова. Я то учёл бы эти детали насколько мне известно Ассемблер умеет и лучше работает с битами чем с++.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13219 / 6851 / 1826
Регистрация: 18.10.2014
Сообщений: 17,375
22.01.2021, 00:37
Цитата Сообщение от Nexi99 Посмотреть сообщение
Что быстрее char или bool.
Быстрее для какой цели? Для представления булевских значений? Быстрее, разумеется, bool, потому что компилятор заранее знает, что bool имеет только два допустимых значения. Это может весьма активно использоваться в оптимизации.

Цитата Сообщение от Nexi99 Посмотреть сообщение
С одной стороны bool может хранить только 0 и 1, по сути bool должен читать 1 бит, для того чтобы его прочитать возможно вызывается функция что вызывает нагрузку потому что в стандартном режиме считывается 1 байт
Никто так не делает. Никакой необходимости вычитывать единственный бит нет.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
22.01.2021, 00:45
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Никто так не делает. Никакой необходимости вычитывать единственный бит нет.
Значит в обоих случаях считывается полный байт? А почему тогда bool быстрее речь конечно же идёт о логических значениях а их может быть только 2?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13219 / 6851 / 1826
Регистрация: 18.10.2014
Сообщений: 17,375
22.01.2021, 00:48
Цитата Сообщение от Nexi99 Посмотреть сообщение
Значит в обоих случаях считывается полный байт?
Во всех случаях считывается полный байт. А как еще? Мне не знакомы аппаратные платформы, которые могут считывать из памяти меньше чем полный байт. Более того, даже и байты мало кто читать умеет, а вместо этого работает целыми машинными словами.

Цитата Сообщение от Nexi99 Посмотреть сообщение
А почему тогда bool быстрее речь конечно же идёт о логических значениях а их может быть только 2?
Вот именно потому, что их всего два. Если не одно, то заведомо второе. Это существенная оптимизационная возможность.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
22.01.2021, 01:26
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот именно потому, что их всего два. Если не одно, то заведомо второе. Это существенная оптимизационная возможность.
Да но при копировании если копируется 0 или 1 то остальные 7 бит необходимо заполнить 0ми. Значит должно быть ещё что-то. Вполне возможно что один первый бит копируется а остальные заполняются 0ми. Отсюда 2 вывода считывание данных происходит быстрее а запись медленнее, потому что нам нужно полный байт записать. Использование битовых массивов очень сильно снизило бы нагрузку Ассемблер с ними умеет работать, но минимальный объём чтения регистра 1 байт по этой причине видимо всегда читается один байт будет там 1 бит или не один. По крайней мере битовые массивы смогли бы сэкономить память.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Более того, даже и байты мало кто читать умеет, а вместо этого работает целыми машинными словами.
Там наверное будет размер указателя 4-8 байт, процессор очень быстрый наверное и мелочиться с байтами нет особой надобности, может даже там и нету байтовых регистров. В принципе в стеке аргументы функции все по 4 байта даже те что по 1 и 2, исключения составляют 8ми байтники и вещественные числа.
Да интересно это всё казалось бы вопрос для школьника а ответ будешь годами искать.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13219 / 6851 / 1826
Регистрация: 18.10.2014
Сообщений: 17,375
22.01.2021, 04:25
Цитата Сообщение от Nexi99 Посмотреть сообщение
Да но при копировании если копируется 0 или 1 то остальные 7 бит необходимо заполнить 0ми. Значит должно быть ещё что-то. Вполне возможно что один первый бит копируется а остальные заполняются 0ми. Отсюда 2 вывода считывание данных происходит быстрее а запись медленнее, потому что нам нужно полный байт записать.
Это совершенно бессмысленный вывод. Полный байт придется записывать всегда, если не больше. Поэтому никакой разницы в скорости записи нет и считать биты - бессмысленно.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Использование битовых массивов очень сильно снизило бы нагрузку Ассемблер с ними умеет работать, но минимальный объём чтения регистра 1 байт по этой причине видимо всегда читается один байт будет там 1 бит или не один. По крайней мере битовые массивы смогли бы сэкономить память.
Никто вам не запрещает использовать битовые массивы. Это будет медленно, но сэкономит память. Но к рассматриваемому вопросу это никакого отношения не имеет. И при чем здесь ассемблер - тоже не ясно.

Цитата Сообщение от Nexi99 Посмотреть сообщение
ответ будешь годами искать
Да, если искать глубинный смысл в темах, которые и выеденного яйца не стоят.
1
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
22.01.2021, 05:43
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Полный байт придется записывать всегда
Я читал инструкцию Ассемблер может вести запись побитно, хотя это может казаться иллюзией, может казаться что пишется бит а может писаться и байт. Найти бы конкретную информацию могут ли языки программирования писать биты если да то это очень важная часть.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Да, если искать глубинный смысл в темах, которые и выеденного яйца не стоят.
Кому как увидим, было бы желание и самое главное время работать над этим.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.01.2021, 10:00
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я читал инструкцию Ассемблер может вести запись побитно
Еще бы понимать прочитанное...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
22.01.2021, 10:04
Цитата Сообщение от Nexi99 Посмотреть сообщение
Значит signed char или char выдадут -128 до 127
Что такое "выдадут"?

В машине нет таких понятий, как "хранить знаковое число" и "хранить беззнаковое число". Машина умеет хранить только абстрактный набор битов и больше ничего. И умеет трактовать один и тот же набор битов как знаковое число или как беззнаковое число

C
#include <stdio.h>
 
unsigned char c = 255;
 
void foo (signed char *ptr)
{
  if (*ptr < 0)
    printf ("foo: les\n");
  else
    printf ("foo: grt\n");
}
 
void bar (unsigned char *ptr)
{
  if (*ptr < 0)
    printf ("bar: les\n");
  else
    printf ("bar: grt\n");
}
 
int main (void)
{
  printf ("%hhd\n", c);
  printf ("%hhu\n", c);
  foo (&c);
  bar (&c);
  return 0;
}
Code
$ gcc t.c
$ ./a.out
-1
255
foo: les
bar: grt
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
22.01.2021, 10:04
Если аппаратура и микропрограммное обеспечение ЭВМ предусматривает возможность записи частей машинного слова, меньших байта, то что мешает компилятору C++ или интерпретатору VBA воспользоваться этой возможностью?
Компиляторы и ассемблеры это обычные программы (или устройства) для ЭВМ, создающие объектный код программы для целевой платформы.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13219 / 6851 / 1826
Регистрация: 18.10.2014
Сообщений: 17,375
22.01.2021, 11:20
Цитата Сообщение от politoto Посмотреть сообщение
Если аппаратура и микропрограммное обеспечение ЭВМ предусматривает возможность записи частей машинного слова, меньших байта, то что мешает компилятору C++ или интерпретатору VBA воспользоваться этой возможностью?
Совершенно верно. С теми оговорками, что:

1. Как вы сами сказали, эта возможность была бы доступна в одинаковой мере всем трансляторам языков программирования, а не только какому-то волшебному "ассемблеру".

2. В рамках нашей вселенной на текущем этапе ее существования такая аппаратная архитектура являлась бы экзотической. Потому говорить о таких возможностях в огульном контексте, без привязки к этой конкретной экзотической архитектуре, было бы странно.
0
Эксперт .NET
 Аватар для Rius
13846 / 7889 / 1706
Регистрация: 25.05.2015
Сообщений: 23,952
Записей в блоге: 14
22.01.2021, 11:38
Есть архитектуры реальные, не экзотические, где возможны манипуляции отдельными битами, без чтения/модификации/записи полного байта.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13219 / 6851 / 1826
Регистрация: 18.10.2014
Сообщений: 17,375
22.01.2021, 12:17
Цитата Сообщение от Rius Посмотреть сообщение
Есть архитектуры реальные, не экзотические, где возможны манипуляции отдельными битами, без чтения/модификации/записи полного байта.
Прекрасно! Назовите хотя бы одну.
0
Эксперт .NET
 Аватар для Rius
13846 / 7889 / 1706
Регистрация: 25.05.2015
Сообщений: 23,952
Записей в блоге: 14
22.01.2021, 12:46
https://developer.arm.com/documentation/dai0179/b/
PDF
Раздел 2.5
Bit-banding maps a complete word of memory onto a single bit in the bit-band region. For example, writing to one of the alias words will set or clear the corresponding bit in the bitband region.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
22.01.2021, 19:07
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Совершенно верно. С теми оговорками, что:
1. Как вы сами сказали, эта возможность была бы доступна в одинаковой мере всем трансляторам языков программирования, а не только какому-то волшебному "ассемблеру".
2. В рамках нашей вселенной на текущем этапе ее существования такая аппаратная архитектура являлась бы экзотической. Потому говорить о таких возможностях в огульном контексте, без привязки к этой конкретной экзотической архитектуре, было бы странно.
Но имеет место быть
Цитата Сообщение от Rius Посмотреть сообщение
Bit-banding maps a complete word of memory onto a single bit in the bit-band region. For example, writing to one of the alias words will set or clear the corresponding bit in the bitband region.
Значит битами оперировать можно, вопрос в том реализовано это компиляторами или делать это нужно вручную через Ассемблер.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13219 / 6851 / 1826
Регистрация: 18.10.2014
Сообщений: 17,375
22.01.2021, 19:32
Цитата Сообщение от Rius Посмотреть сообщение
https://developer.arm.com/documentation/dai0179/b/
PDF
Раздел 2.5
Bit-banding maps a complete word of memory onto a single bit in the bit-band region. For example, writing to one of the alias words will set or clear the corresponding bit in the bitband region.
Bit-banding - интересная фича, но совсем не то и не для того, о чем идет речь здесь. Это не доступ к произвольным битам в пользовательских структурах данных, а доступ к произвольным битам в специальном регионе памяти. И цель всего этого - отнюдь не увеличение скорости индивидуального доступа, а обеспечение атомарности индивидуального доступа в многопоточном окружении. "Под капотом" такой доступ выполняется все через ту же последовательность Read-Modify-Write, но лишь с обеспечением атомарности.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Значит битами оперировать можно, вопрос в том реализовано это компиляторами или делать
В данном случае: можно оперировать битами в специально выделенном регионе "битовой памяти", а не произвольными битами.

То есть вы можете, если вам так захочется, размещать в этом регионе свои булевские переменные. Но никакого "ускорения" от работы с одним битом вместо одного байта вы при этом не получите. Все это делалось не для ускорения, а для обеспечения атомарности битового доступа в многопоточном окружении.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.01.2021, 19:32

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 , провести арифметические вычисления и затем перевести ее...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru