Что есть что? · bei.pm
В этой рубрике есть статьи о форматах файлов и реверс-инжиниринге.
Но дело обстоит так:
Существует множество языков программирования, и многие люди знают некоторые вещи под совершенно другими названиями — или вообще не имеют представления о существовании самых фундаментальных понятий, поскольку их язык программирования абстрагирует от них.
короче говоря:
Моя нотация в основном основана на C99 <stdint.h>
. Тот, кто знаком с этой нотацией, безусловно, разберется с моей.
Целое число
Целые числа — это просто говоря, целые числа, то есть числа без дробной части.
При этом целые числа в форматах данных, как правило, определяются в пределах фиксированного диапазона значений, своего рода разрешения. Я указываю это в битах — по этой причине, что "байт" и основанные на нем типы (слово, двойное слово и т.д.) обычно зависят от платформы.
Кроме того, различают целые числа на натуральные числа (ℕ, то есть без знака - Unsigned) и целые числа (ℤ, то есть со знаком - Signed).
Эта информация видна по знаку в обозначении (u
или s
).
При этом возможно, что знаковые целые числа могут быть представлены либо в единичном дополнении, либо в двойном дополнении.
Если не указано иное, используется двойное дополнение, так как это предпочтительное представление в современной информатике.
Беззнаковые числа я указываю в своих документациях как uint
, с последующим указанием точности в битах.
Знаковые числа я указываю в своих документациях как sint
, также с последующим указанием точности в битах.
Я отказываюсь от использования типа данных "char" для символов, так как строки обычно представляют собой только последовательности целых значений с особой интерпретацией.
Поэтому они представлены как uint(8)[].
Примеры:
Обозначение | C99 stdint.h -эквивалент |
Описание | Диапазон значений |
---|---|---|---|
uint(16) | uint16_t | Беззнаковое целое число, длина 16 бит | 0 - 65.535 |
sint(8) | int8_t | Знаковое целое число, длина 8 бит, дополнительный код | -126 - 127 |
uint(24) | uint32_t:24 | Беззнаковое целое число, длина 24 бита | 0 - 16.777.216 |
Фиксированные десятичные значения
Фиксированные значения — это числовые значения из спектра Рациональных чисел (Q), которые имеют запятую и десятичные знаки.
В фиксированных значениях — и отсюда название — позиция запятой заранее задана типом данных.
Таким образом, для чисел этого типа данных существует фиксированный диапазон; математически выражаясь, область чисел конечна.
На практике этот тип данных в основном используется на платформах без достаточно быстрого оборудования для вычислений с плавающей точкой, так как расчеты фиксированных значений могут выполняться с помощью целочисленных единиц.
Также этот тип данных, например, используется системами управления базами данных, когда необходимо выполнять фиксированные требования.
Можно привести в пример системы для постоянного хранения финансовых данных; большинство валют ограничиваются 2 знаками после запятой.
(Однако нецелесообразно использовать фиксированные значения для этого; разумнее сохранить минимальную валютную единицу как целое число и оставить остальную часть представления).
Аналогично целочисленным значениям, для фиксированных значений я указываю разрешение числа до и после запятой:
ufixed(9,7)
обозначает тип данных, который не имеет знака и резервирует 9 бит для значения до запятой, а также 7 бит для значения после запятой; в сумме это составляет 16 бит и, например, может охватывать диапазон от (0,0) до (511,127) как вектор из двух независимых целых чисел.
Однако такая интерпретация в десятичном представлении упустит 28 чисел, так как, вероятно, на практике будет ограничиваться максимумом (511,99).
Вместо прямой интерпретации фиксированного значения как вектора из 2 отдельных целых чисел — что почти всегда означает неиспользуемую область данных при преобразовании в десятичные числа и ручную передачу — вместо этого десятичная часть может быть интерпретирована как доля от общего разрешения.
На примере упомянутого ufixed(9,7)
получается доля с знаменателем 27 — диапазон чисел тогда будет от 0,00 до 511 + 126⁄127
Для преобразования в десятичное представление десятичная часть должна делиться на 128.
С этим вариантом проще выполнять арифметические операции, так как перенос происходит автоматически, что делает этот вариант в большинстве случаев предпочтительным.
Однако у этого варианта есть недостаток: десятичные знаки в десятичном представлении больше не имеют гарантированного разрешения, поэтому одна десятичная цифра больше не эквивалентна 0.01
, а 0.007874
, что приведет к соответствующим ошибкам округления.
Какой способ интерпретации используется, документируется на месте использования.
Числа с плавающей запятой
Числа с плавающей запятой — это математически более сложные выражения, в которых целое число с фиксированной точностью представляется через математический термин так, чтобы десятичная часть образовывалась путем смещения, что непосредственно связано с научной нотацией.
Наиболее распространенный способ реализации этого был стандартизирован с помощью IEEE 754 и с тех пор признан международным стандартом.
При этом число с плавающей запятой обычно состоит из следующих компонентов:
Знак (0 или 1 ) |
Экспонента | Мантисса |
В то время как знак как бинарная информация "да/нет" может быть легко извлечен, само число формируется по уравнению
Мантисса * 2Экспонента
Кроме того, существует ряд константных значений, которые охватывают особые случаи рациональных чисел — среди них ±∞
и NaN
("нечисловое значение").
Числа с плавающей запятой особенно полезны, когда точность не так важна, так как при использовании такого типа значений неизбежно возникают ошибки округления и, следовательно, потери точности. Обычно числа с плавающей запятой используются, например, для определения координат, таких как векторные вершины в 3D-моделях или кривые Безье/сплайны для целей оптической репрезентации.
В форматах данных числа с плавающей запятой специфицируются как float(Мантисса, Экспонента)
.
Если используется формат, отличающийся от IEEE 754, это будет указано соответствующим образом.