Контроллы вывода чисел: представления и параметры

Практический разбор контроллов вывода чисел: роли FRMDEC, FRMHEX, FrmFloD и FrmFloD16, математическое масштабирование формата 16.16 и параметры, которые нужно уточнять перед вызовом.

Схема представления числа в формате 16.16: 32-битное слово разделено на целую и дробную части

Назначение

Контроллы вывода чисел переводят внутреннее представление значения в текст на экране. Каталог описывает несколько таких операций: FRMDEC выводит число в десятичном виде с предварительной очисткой поля, FRMHEX связан с выводом в шестнадцатеричной записи, а FrmFloD и FrmFloDec берут числовое значение из стека FPU, конкретно из St(0), и формируют из него десятичный текст. Каждая операция решает свою задачу, и их роли не следует смешивать.

Представление данных

Формат с фиксированной точкой 16.16 делит беззнаковое 32-битное слово на две половины: верхние 16 бит дают целую часть, нижние 16 бит задают дробь с шагом 1/65536. Значение 0x18000 в этом представлении равно 98304, а деление на масштаб 65536 даёт 1,5. Это иллюстрация того, как целое машинное слово превращается в число с дробной частью; отображаемая точность зависит от выбранного формата вывода, а не от самого представления.

FPU оперирует значениями с плавающей точкой, где число описывается полями знака, экспоненты и значащей части. Здесь масштабирование не фиксировано, а определяется экспонентой конкретного значения. Каталог указывает на числовое значение в St(0) как на источник для FrmFloD и FrmFloDec: это входное представление, а не отдельная схема хранения. Различия между целым, фиксированной точкой и плавающей точкой касаются точности, диапазона и способа интерпретации, а каждая функция вывода работает с определённым из них.

Математический пример

Шестнадцатеричное число 0x37777 переводится в десятичную запись как 227191. Деление на 65536 даёт 3,4666595458984375. Стандартное округление до двух знаков после запятой приводит к 3,47. Это расчёт по определению формата 16.16, а не результат выполнения функции FrmFloD16. Каталог помечает её как Num16 с двумя десятичными дробными знаками, что описывает ожидаемое назначение, но не подтверждает, что реализация выполняет именно деление или именно такое округление.

Параметры вызова

Перед вызовом контролла нужно знать несколько вещей. Первое: в каком представлении приходит входное значение, целое, фиксированная точка или FPU. Второе: какое поле экрана или какой буфер является целью вывода. Третье: требуемая точность, сколько дробных знаков отображается. Четвёртое: политика обработки ошибок, что происходит при переполнении или отрицательном значении в беззнаковом формате. Пятое: влияние на регистры и переменные, сохраняет ли функция контекст или изменяет его.

Ограничения

Каталог не фиксирует единый общий контракт для всех контроллов вывода. FRMDEC задокументирована как десятичный вывод с предварительной очисткой; для FRMHEX очистка поля не подтверждена, и переносить это поведение на неё нельзя без отдельного подтверждения. Подписи Frt1 и Dta1 встречаются в описаниях, но не доказывают универсальное поле форматирующего контролла. Математический расчёт ожидаемого значения не заменяет проверку того, что именно делает конкретная функция при выполнении.