Разное

Формат bcd упакованный: Упакованные числа в формате BCD в ABAP

Упакованные числа в формате BCD в ABAP

Ни для кого не секрет, что в языке ABAP есть встроенный тип данных p (англ. packed number — упакованное число).

В то же время, в ABAP-словаре есть типы данных DEC, QUAN и CURR — упакованные числа в формате BCD, соответствующие типу данных p.

Наверняка, вы уже использовали эти типы данных для хранения сумм или количества чего-либо, но возможно вы не задумывались как они устроены.

Давайте с этим разберемся.

Двоично-десятичный код

BCD (англ. binary-coded decimal — двоично-десятичный код) — такой код, при котором каждый десятичный разряд числа записывается в виде его четырёхбитного двоичного кода.

Почему в виде четырехбитного кода? Потому что именно 4-х бит достаточно для того, чтобы представить диапазон числе от 0 до 9.

Целые числа

Рассмотрим пример.

Целое число 42710 можно записать как 0100 0010 0111BCD.

Для хранения десятичного числа 427 потребуется 2 байта (4-битный код для знака числа нам сейчас не важен, поэтому будем просто обозначать его присутствие).

Исходя из этого в ABAP редакторе при объявлении переменной типа p нам потребуется указать длину не менее 2 байт.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

Show hidden characters

DATA lv_p TYPE p LENGTH 2.

view raw Number in BCD format.abap hosted with ❤ by GitHub

Для того, чтобы определить, сколько десятичных разрядов может хранить переменная типа p используйте следующую формулу:

2*n — 1.

где n — это количество байт (для типа p это LENGTH).

Таким образом, переменная lv_p из нашего примера может хранить число с 3-мя десятичными разрядами, например 427.

При этом в ABAP-словаре, например, при создании домена, нам необходимо указывать не количество байт как в ABAP редакторе, а количество десятичных разрядов числа (количество цифр в числе). Обратите внимание, что после указания числа позиций автоматически заполнится поле «Длина вывода».

Числа с десятичной частью

Теперь давайте рассмотрим похожий пример, но возьмем число побольше и с десятичными разрядами. Например 1287.58.

Для хранения 6-ти цифр этого числа (4 в целой части и 2 в десятичной) нам требуется 4 байта. Поэтому, при объявлении переменной в ABAP редакторе указываем длину минимум 4.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

Show hidden characters

DATA lv_p TYPE p LENGTH 4 VALUE ‘1287.58’.

view raw Number in BCD format_length_4.abap hosted with ❤ by GitHub

Проверяем себя. Используем формулу 2*n — 1.

2 * 4 — 1 = 7.

Т.е. в переменной типа p c длиной 4 байта мы можем хранить максимум 7 цифр. Отлично!

Если указать LENGTH 3, то этого будет недостаточно, т.к. в 3-х байтах мы можем хранить только 5 чисел, а у нас их 6.

2 * 3 — 1 = 5.

При попытке сохранить в такую переменную наше число будет поднято исключение cx_sy_conversion_overflow.

Идем дальше. В ABAP словаре при создании домена нам необходимо будет указать «Число позиций» минимум 6, т. к. в нашем числе 6 цифр. Из этих 6-ти позиций 2 будут выделены для хранения десятичных разрядов.

Длина вывода автоматически заполнится значением 7, т.к. одна позиция будет хранить разделитель тысяч ‘,’ (запятая, т.е. 1

,287.58 ).

Обратите внимание, что разделитель ‘.’ (точка) не хранится в памяти вместе с числом. Местонахождение разделителя просто известно компилятору и сгенерированный код действует соответствующим образом для различных арифметических операций.

Вместо заключения

Ограничения типов данных можно посмотреть здесь.

Надеюсь, эта заметка вам пригодится, а чтобы не потерять ее подписывайтесь на telegram канал.

Изображение поста взято здесь: Abstract vector created by rawpixel.com — www.freepik.com


P.S. Ира, Саша — спасибо за тему)

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

BCD формат на Assembler в AVR Atmega

  1. 1. Распакованный формат
  2. 2. Упакованный формат — BCD
  3. 3. Преобразование числа в BCD в шестнадцатеричный вид и обратно

Десятичные числа на машинном языке могут быть представлены в виде восьмиразрядных последовательностей единиц и нулей, то есть байтов. При этом существует два вида форматов представления десятичных чисел. Это упакованный формат ( BCD ) и распакованный.

Распакованный формат

В данном формате один разряд десятичного числа помещается в один байт. А именно в младшую тетраду байта, тогда как старшая тетрада (именуемая зоной) заполняется единицами. К примеру число 157 будет выглядеть следующим образом.


Упакованный формат — BCD

В упакованном формате байт содержит два разряда десятичного числа и также может содержать код знака. Как в ниже следующем примере, в котором представлено число «-1574».

Преобразование числа в BCD в шестнадцатеричный вид и обратно

При работе с микроконтроллерами Atmega может понадобиться преобразование числа в шестнадцатеричном виде в формат упакованного десятичного числа, то есть в BCD формат:

 ;======= Преобразование из BCD в HEX ===================================================
 BCD_to_HEX:
    push    r16              ; Помещаем преобразуемую величину в стек
    andi    r16,0b11110000   ; Маскируем регистр r16, как старший разряд
    swap    r16              ; Меняем тетрады местами
    ldi     r17,10           ; Записываем во вспомогательный регистр значение 10
    mul     r16,r17          ; Умножаем значение регистра r16 на 10, результат сохраняется
                             ; в регистры r1, r0
    pop     r16              ; Изымаем сохраненную величину из стека 
    andi    r16,0b00001111   ; Маскируем регистр r16, как младший разряд
    add     r16,r0           ; Производим сложение регистра r16 с регистром r0, 
                             ; в результате получаем двоичное число от 0 до 99
    ret

А также обратное преобразование:

;======= Преобразование из HEX в BCD ====================================================
 HEX_to_BCD:
    clr     r17            ; Очищаем регистр help
 HEX_to_BCD_l: 
    subi    r16,10         ; temp = temp — 10
    brcs    HEX_to_BCD_2   ; Прервать, если перенос установлен 
    inc     r17            ; Инкрементируем r17 
    rjmp    HEX_to_BCD_l   ; Проходим по циклу проверки заново
 HEX_to_BCD_2: 
    subi    r16,-10        ; компенсируем отрицательное значение в r16
    swap    r17            ; Меняем тетрады местами
    or      r16,r17        ; Объединяем полученные значения в Упакованный BCD
    ret

Как Вы уже заметили, работа производится в этих программах с четырьмя регистрами: r0, r1, r16, r17. Целевым регистром в данном случае выступает регистр r16. Также эти программки работают с числами от 0 до 99.

Внимание. Также для работы библиотеки требуется инициализировать Стек микроконтроллера. Например следующим образом:

 ;======= Макросы ========================================================================
 ; Макрос вывода в порт или регистр
 .macro outi             
    ldi     r16, @1 
    out     @0,R16
 .endm
 ;========================================================================================
 RESET:
    outi    SPL,Low(RAMEND)     ; Инициализация стека
    outi    SPH,High(RAMEND)    

BCD или двоично-десятичный код

Улучшить статью

Сохранить статью

Нравится Статья

  • Уровень сложности: Базовый
  • Последнее обновление: 23 июн, 2022

  • Читать
  • Обсудить
  • Улучшить статью

    Сохранить статью

    Нравится Статья

    Binary Coded Decimal или BCD — это еще один процесс преобразования десятичных чисел в их двоичные эквиваленты.
     

    • Это форма двоичного кодирования, в которой каждая цифра десятичного числа представлена ​​в виде битов.
    • Это кодирование может быть 4-битным или 8-битным (обычно 4-битное предпочтительнее).
    • Это быстрая и эффективная система, которая преобразует десятичные числа в двоичные числа по сравнению с существующей двоичной системой.
    • Они обычно используются в цифровых дисплеях, где манипулирование данными является сложной задачей.
    • Таким образом, двоично-десятичный код играет здесь важную роль, поскольку манипуляция выполняется с учетом каждой цифры как отдельной отдельной подсхемы.

    Эквивалент десятичного числа в двоично-десятичном коде записывается путем замены каждой десятичной цифры в целой и дробной частях ее четырехбитным двоичным эквивалентом. представляющие веса различных битов в четырехбитных группах, начиная с MSB и продвигаясь к LSB. Эта особенность делает его взвешенным кодом, что означает, что каждый бит в четырехбитной группе, представляющей данную десятичную цифру, имеет назначенный вес.
    Многие десятичные значения имеют бесконечное представление разрядного значения в двоичном формате, но имеют конечное разрядное значение в двоично-десятичном коде. Например, 0,2 в двоичном формате — это 0,001100…, а в двоично-десятичном формате — 0,0010. Он позволяет избежать дробных ошибок, а также используется в огромных финансовых расчетах.

    Рассмотрим следующую таблицу истинности и сосредоточимся на том, как они представлены.

    Таблица истинности для двоично-десятичной системы счисления0059 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001

    В системе нумерации BCD данное десятичное число разделяется на части по четыре бита для каждой десятичной цифры в числе.

    Каждая десятичная цифра преобразуется в ее прямую двоичную форму (обычно представленную в 4 битах).

    Например:

    1. Преобразование (123)10 в BCD

    Из приведенной выше таблицы истинности
    1 -> 0001
    2 -> 0010 ->
    3 получается 0001 0010 0011
     

    2. Преобразование (324) 10 в BCD

    (324) 10 -> 0011 0010 0100 (BCD)

    Снова из таблицы истины выше,
    3 -> 0011
    2 -> 0010
    4 -> 0100 
    , таким образом, двоично-десятичный код становится -> 0011 0010 0100 
     

    Вот как десятичные числа преобразуются в эквивалентные им двоично-десятичные числа.
     

    • Примечательно, что BCD представляет собой не что иное, как двоичное представление каждой цифры десятичного числа.
    • Нельзя игнорировать тот факт, что двоично-десятичное представление данного десятичного числа использует дополнительные биты, что делает его тяжеловесным.

    Связанные статьи:

    1. Программа для преобразования номера BCD в десятичное число
    2. BCD ADDER в цифровой логике
    3. BCD до 7 сегмента декодер

  • 9000 2 9000 2

    9000 2

    9000 2

    9000 2

    9000 2

    9000 2

  • Сохранить статью

    Целые числа, упакованные числа, двоичные числа с плавающей запятой

    Целые числа, упакованные числа, двоичные числа с плавающей запятой — Документация по ключевым словам ABAP


    SAP NetWeaver AS ABAP, выпуск 752, ©Авторское право, 2017 SAP AG. Все права защищены.

    ABAP — Документация по ключевым словам → ABAP-словарь → Предопределенные типы данных в словаре ABAP → Атрибуты предопределенных типов словарей → Общие типы словарей →

    Целые числа, упакованные числа, двоичные числа с плавающей запятой

    Следующие типы используются для общего описания числовых типов (за исключением десятичных чисел с плавающей запятой):

    • INT1, INT2, INT4, INT8 для целых чисел
    Эти типы описывают общие 1-байтовые, 2-байтовые, 4-байтовые и 8-байтовые целые числа. Типы ABAP группы, назначенные типам INT1 и INT2, не могут быть указаны ни статически, ни динамически в операторах ABAP. Эти типы встречаются только в программах ABAP по ссылке на типы INT1 и INT2 из ABAP-словаря.
    • DEC для упакованных номеров
    Этот тип описывает общие упакованные числа в формат БКД. При использовании к типу необходимо добавить длину и количество знаков после запятой. Количество знаков после запятой должно быть меньше или равно длине и не может превышать 14.
    • FLTP для двоичных чисел с плавающей запятой
    Этот тип описывает общие двоичные числа с плавающей запятой. Поля таблицы этого типа нельзя использовать в качестве ключевых полей таблиц базы данных.

    Примечания

    • В определении типов данных на основе встроенного типа DEC следует использовать нечетное количество разрядов. Эти значения хранятся в формат BCD, для которого в ABAP (данные тип p), возможно только нечетное количество цифр, так как используется полбайта для знака. Однако, если тип данных DEC имеет четное число символов, длина ассоциированного Тип ABAP p округляется и, следовательно, содержит следующее наибольшее нечетное число. мест. Например, это может вызвать переполнение, а затем исключения при записи в таблицы базы данных. То же самое относится к встроенным типам CURR, DF34_DEC, DF16_DEC и QUAN, которые технически обрабатываются так же, как тип DEC.
    • Если встроенные типы INT1, INT2, INT4 и INT8 используется для указания типов, количества мест обычно должно быть указано как 2, 5, 10 и 19. Если используется тип FLTP, 16 разрядов и такое же число должны быть указаны десятичные разряды. Указанное количество мест обычно игнорируется данными типы. По умолчанию они описывают зависящие от платформы целые числа или двоичные числа с плавающей запятой и занимают 1, 2, 4 или 8 байтов.
    • В случае целочисленных типов указанные разряды выражают возможные десятичные разряды без знака.
    • В случае двоичных чисел с плавающей запятой 16 выражает приблизительную точность стандарта IEEE-754 (двойная точность).
  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *