[?] основы двоичной системы исчисления

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

[?] основы двоичной системы исчисления

Post by dmitry_79 »

Прошу прощения за бестолковый вопрос.
Немного теории...

Как отличить знаковое INT от беззнакового INT в двоичной системе исчисления?

Пример:
число 5 в двоичной системе записывается как 101.
число -5 в двоичной системе записывается как 1111 1011 (побитно инвертируется и прибавляется единица)

Но: число 251 выглядит в двоичной системе так же как и число -5: 1111 1011

Как определить какое число записано -5 или 251? Что-то я не догоняю... :shock:
Schtiel
Site Admin
Posts: 1122
Joined: Wed Sep 06, 2006 12:03 pm
Location: CIS

Re: [?] основы двоичной системы исчисления

Post by Schtiel »

dmitry_79 wrote:Как определить какое число записано -5 или 251? Что-то я не догоняю... :shock:
Все зависит от того, как вы число интерпретируете. Например, у беззнакового числа размером 1 байт диапазон значений будет 0..255, а у знакового -128..127. Но различных значений и в том, и в другом случае будет 256.
Представление целых чисел в беззнаковых целых типах.

Для беззнакового представления все разряды ячейки отводятся под представление самого числа. Например, в байте (8 бит) можно представить беззнаковые числа от 0 до 255. Поэтому, если известно, что числовая величина является неотрицательной, то выгоднее рассматривать ее как беззнаковую.

Представление целых чисел в знаковых целых типах.

Для представления со знаком самый старший (левый) бит отводится под знак числа, остальные разряды - под само число. Если число положительное, то в знаковый разряд помещается 0, если отрицательное - 1. Например, в байте можно представить знаковые числа от -128 до 127.
CoMod
Site Admin
Posts: 3992
Joined: Thu Feb 16, 2006 3:25 pm
Location: Russia

Re: [?] основы двоичной системы исчисления

Post by CoMod »

dmitry_79 wrote:Как отличить знаковое INT от беззнакового INT в двоичной системе исчисления?
Вообще у тебя в вопросе уже подвох
Как отличить знаковое INT от беззнакового WORD в двоичной системе исчисления?
Если дело качается аналоговых входов/выходов то там всегда подразумевается знаковое INT.

Если встречаешь внутри программы, то обращай внимание на используемые команды:
I+, I- - значит INT
AW W#16#0FFF - большая вероятность WORD
dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

Re: [?] основы двоичной системы исчисления

Post by dmitry_79 »

CoMod wrote:Вообще у тебя в вопросе уже подвох
Т.е. я правильно понимаю: если тип данных INT то всегда подразумеваается знаковое?

Но ведь значение INT больше 32767 впринципе ошибки не вызывает? Или это уже тип данных WORD?
CoMod
Site Admin
Posts: 3992
Joined: Thu Feb 16, 2006 3:25 pm
Location: Russia

Re: [?] основы двоичной системы исчисления

Post by CoMod »

dmitry_79 wrote:
CoMod wrote:Вообще у тебя в вопросе уже подвох
Т.е. я правильно понимаю: если тип данных INT то всегда подразумеваается знаковое?

Но ведь значение INT больше 32767 в принципе ошибки не вызывает? Или это уже тип данных WORD?
оно автоматом представляется в DINT = двойной 32-х разрядный INT.

Системы программирования с контролем типов выдают ошибку при попытке использования неправильных значений.
А системы без контроля типов проглатывают ошибку и спутник получает правое вращение вместо левого - типичная ошибка для С.
CHANt
Posts: 501
Joined: Tue Jun 27, 2006 5:52 am
Location: Russia

Re: [?] основы двоичной системы исчисления

Post by CHANt »

dmitry_79 wrote:Т.е. я правильно понимаю: если тип данных INT то всегда подразумеваается знаковое?
В 15-бите хранится информация о знаке:
1 - минус
0 - плюс
Диапазон от -32768 … +32767.
"Правила синтаксиса в STEP7 обеспечивают спецификацию целых значений (INT) только в десятичном (decimal) формате представления" Курс ST-7PRO1
Безнаковое значение целого только в шестнадцатеричной форме 0 … 65535
CoMod wrote:оно автоматом представляется в DINT = двойной 32-х разрядный INT.
Вроде, это правило в STEP7 распространяется только на константы.
Schtiel
Site Admin
Posts: 1122
Joined: Wed Sep 06, 2006 12:03 pm
Location: CIS

Re: [?] основы двоичной системы исчисления

Post by Schtiel »

dmitry_79 wrote:Т.е. я правильно понимаю: если тип данных INT то всегда подразумеваается знаковое?

Но ведь значение INT больше 32767 впринципе ошибки не вызывает? Или это уже тип данных WORD?
Попробую объяснить на пальцах :)

Тип INT и тип WORD занимают 2 байта (16 бит), могут принимать значения от 0000 0000 0000 0000 до 1111 1111 1111 1111. Если данные рассматривать как INT, то диапазон возможных значений от -32768 до 32767, если как WORD - то от 0 до 65535 (0xFFFF). К одной и той же ячейке можно обращаться и как к WORD, и как к INT.

При добавлении к INT, равному 32767, получим переполнение - в ячейке будет -32768.
dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

Re: [?] основы двоичной системы исчисления

Post by dmitry_79 »

CoMod wrote:...Если дело качается аналоговых входов/выходов то там всегда подразумевается знаковое INT.
Дело как раз их и касается :)
Schtiel wrote:При добавлении к INT, равному 32767, получим переполнение - в ячейке будет -32768.
Тогда получается нельзя подключать напрямую выход LMN_PER , PID регулятора FB41 напрямую к PQW1? Он (выход регулятора) имеет тип данных WORD, а на аналоговый модуль вывода, насколько я понимаю, всегда нужно подавть INT (-32768...32767 - диапазон зависит от битности модуля) . Потому-что исходя из вышесказанного может возникнуть переполнение?

Если я прав, то получается нужно как-то преобразовывать значения беззнакового INT (WORD) к знаковому INT? (имеется ввиду приводить диапазон значений 0...65535 к диапазону -32768...32768)

Или я не прав, и по этому поводу заморачиваться не слудует: смело подключать напрямую?

Совсем что-то запутался.... :(
Last edited by dmitry_79 on Wed Mar 10, 2010 9:56 am, edited 1 time in total.
dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

Re: [?] основы двоичной системы исчисления

Post by dmitry_79 »

О! :lol: Наверное дошло до меня: FB41 пишет значение выхода как WORD, а модуль вывода читает это значение как INT. И никаких конфликтов с диапазонами не возникает.

Правильно?
Schtiel
Site Admin
Posts: 1122
Joined: Wed Sep 06, 2006 12:03 pm
Location: CIS

Re: [?] основы двоичной системы исчисления

Post by Schtiel »

dmitry_79 wrote:Тогда получается нельзя подключать напрямую выход LMN_PER , PID регулятора FB41 напрямую к PQW1?
Можно. ПИД-регулятор масштабирует выходное значение LMN_PER в диапазон 0..27648, переполнение не может возникнуть.