Обозначение относится к Informix и его типам DECIMAL и MONEY - AFAIK, никакой другой продукт не использует его.Informix также использует его в своих типах DATETIME и INTERVAL, но это большая часть деталей реализации.
Я всегда знал, что форма на диске - это «extra-64», а не «extra-65».;Я не уверен, что это правильно, но я думаю, что 64 имеет твердую основу.
Форма «избыток-6n» используется для хранения на диске.Преимущество состоит в том, что два десятичных значения в формате диска можно сравнить с помощью memcmp()
, чтобы получить правильное сравнение (хотя значения NULL должны обрабатываться отдельно - значения NULL всегда вызывают боль и горе).
Заголовок decimal.h
из ESQL / C (и C-ISAM) содержит информацию:
/*
* Packed Format (format in records in files)
*
* First byte =
* top 1 bit = sign 0=neg, 1=pos
* low 7 bits = Exponent in excess 64 format
* Rest of bytes = base 100 digits in 100 complement format
* Notes -- This format sorts numerically with just a
* simple byte by byte unsigned comparison.
* Zero is represented as 80,00,00,... (hex).
* Negative numbers have the exponent complemented
* and the base 100 digits in 100's complement
*/
Обратите внимание на упоминание 64, а не 65. Также обратите внимание, что десятичное число в некоторых отношениях является неправильным;данные представлены с использованием нотации «centesimal» (base-100).
Вот некоторые примеры значений, десятичное представление и затем байты для формата на диске.Обратите внимание, что в некоторой степени количество байтов является произвольным.Если используется что-то вроде DECIMAL (16,4), будет 1 байт, знак и показатель степени и 8 байтов данных (и диапазон показателей будет ограничен).Если вы используете DECIMAL (16) - для чисел с плавающей запятой - то диапазон показателей будет гораздо меньше ограничен.
Decimal value Byte representation (hex)
0 80 00 00 00 00
1 C1 01
-1 3E 63
9.9 C1 09 5A 00
-9.9 3E 5A 0A 00
99.99 C1 63 63 00 00 00
-99.99 3E 00 01 00 00 00
999.999 C2 09 63 63 5A
-999.999 3D 5A 00 00 0A
0.1 C0 0A 00 00
-0.1 3F 5A 00 00
0.00012345 BF 01 17 2D 00
-0.00012345 40 62 4C 37 00
1.2345678901234e-09 BC 0C 22 38 4E 5A 0C 22
-1.2345678901234e-09 43 57 41 2B 15 09 57 42
1.2345678901234e+09 C5 0C 22 38 4E 5A 0C 22
-1.2345678901234e+09 3A 57 41 2B 15 09 57 42
И т. Д.