Что есть что? · bei.pm

Этот текст был автоматизированно переведен с помощью OpenAI GPT-4o Mini.

В этой рубрике есть статьи о форматах файлов и реверс-инжиниринге.

Но дело обстоит так:
Существует множество языков программирования, и многие люди знают некоторые вещи под совершенно другими названиями — или вообще не имеют представления о существовании самых фундаментальных понятий, поскольку их язык программирования абстрагирует от них.

короче говоря:
Моя нотация в основном основана на 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 + 126127 Для преобразования в десятичное представление десятичная часть должна делиться на 128.
С этим вариантом проще выполнять арифметические операции, так как перенос происходит автоматически, что делает этот вариант в большинстве случаев предпочтительным.
Однако у этого варианта есть недостаток: десятичные знаки в десятичном представлении больше не имеют гарантированного разрешения, поэтому одна десятичная цифра больше не эквивалентна 0.01, а 0.007874, что приведет к соответствующим ошибкам округления.

Какой способ интерпретации используется, документируется на месте использования.

Числа с плавающей запятой

Числа с плавающей запятой — это математически более сложные выражения, в которых целое число с фиксированной точностью представляется через математический термин так, чтобы десятичная часть образовывалась путем смещения, что непосредственно связано с научной нотацией.
Наиболее распространенный способ реализации этого был стандартизирован с помощью IEEE 754 и с тех пор признан международным стандартом.

При этом число с плавающей запятой обычно состоит из следующих компонентов:

Знак (0 или 1) Экспонента Мантисса

В то время как знак как бинарная информация "да/нет" может быть легко извлечен, само число формируется по уравнению
Мантисса * 2Экспонента

Кроме того, существует ряд константных значений, которые охватывают особые случаи рациональных чисел — среди них ±∞ и NaN ("нечисловое значение").

Числа с плавающей запятой особенно полезны, когда точность не так важна, так как при использовании такого типа значений неизбежно возникают ошибки округления и, следовательно, потери точности. Обычно числа с плавающей запятой используются, например, для определения координат, таких как векторные вершины в 3D-моделях или кривые Безье/сплайны для целей оптической репрезентации.

В форматах данных числа с плавающей запятой специфицируются как float(Мантисса, Экспонента).
Если используется формат, отличающийся от IEEE 754, это будет указано соответствующим образом.