Помогите с алгоритмом преобразования чисел
Число хранится в 3-х байтах - 24-битное целое без знака – значение, без учета положения точки;
«Положение точки» – («000000.00»);
d7 = 11010111 = 215
00 = 00000000 = 0
00 = 00000000 = 0
это значение: 2,1500
-------------------------------
1a 00 00
1a = 11010 = 26
00 = 00000 = 0
00 = 00000 = 0
это значение: 0,2600
------------------------------
00 00 db
00 = 00000000 = 0
00 = 00000000 = 0
db = 11011011 = 219
какое это значение: ?????
Каков алгоритм преобразования?
Дальше по теме:
обрати внимание на десятичную СС и результат, вот твои примеры:
0000d7 hex = 00000000 00000000 11010111 bin = 215 dec -> 2.15[00]
00001a hex = 00000000 00000000 00011010 bin = 026 dec -> 0.26[00]
может последнее значение такое?
0000db hex = 00000000 00000000 11011011 bin = 219 dec -> 2.19[00] dec
теперь подробнее о смысле (может так?):
вопрос уже содержит ответ: "Положение точки = 000000.00"
т.е. формат с фиксированной точкой перед последними двумя цифрами.
но есть разница! обычно фиксируют точку в двоичной СС,
а тут наверно фиксирована после перевода в десятичную,
т.е. алг. = сначала переводиш всё как обычное целое, а потом вставляеш точку.
и для показухи дописываеш 2 незначащих нуля в дробной (чтоб казалась больше) :)
алг. перевода беззнакового (плюсового) целого, такой:
1: текущее число / основание СС = результат (число без младшего разряда) и остаток (младшая цифра, выдвинутая вправо)
2: если результат не ноль (есть значащие цифры) то goto 1
траса выглядит как то так (перевод 128 в десятичную СС), смотри на остатки:
128/10=12 [+8 остаток]
12/10=1 [+2 остаток]
1/10=0 [+1 остаток]
для перевода знаковых, надо проверить (потом дописать) и сделать знак плюс.
деление с остатком это сдвиг вправо на основание СС.
для перевода дробной части (например для FPU) надо делать умножения
т.е. сдвигать влево на основание СС.
вот те ещё и исходник:
; Таблица перекодировки веса в цифры (до 36-ричной системы счисления)
v2asc db '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
; ui2as = 32бит беззнаковое целое в ASCIIZ строку
; Вход: eax = число
; ebx = система счисления
; edi = адрес для ASCIIZ строки (33 байта = максимум)
; Вых: edi = сразу за строкой (можно дописывать)
ui2as:
push eax
push ebx
push ecx
push edx
mov ecx, esp ; щётчик цифр
m1: xor edx, edx ; обнуляем для правельного деления
div ebx ; EDX:EAX / EBX = EAX результат (без младшей цифры), EDX = остаток (младшая цифра)
push edx ; цифру в стек
test eax, eax ; проверка наличия значащих цифр
jnz short m1 ; если есть то повторяем для получения очередной цифры
mov ebx, offset v2asc ; адрес таблицы для перекодировки значений в ASCII символы
m2: pop eax ; берём цифру
xlat ; перекодируем в ASCII
mov [edi], al ; stosb (v2), дописываем в строку
inc edi
cmp ecx, esp
ja short m2 ; повторяем пока в стеке есть цифры
pop edx
pop ecx
pop ebx
pop eax
ret