excess-65 指数格式是什么?

What is the excess-65 exponent format?

根据 IBM Informix 文档:

DECIMAL(p, s) values are stored internally with the first byte representing a sign bit and a 7-bit exponent in excess-65 format.

"excess-65" 格式如何工作?

参考资料

  1. DECIMAL(p,s) Data Types
  2. DECIMAL Storage

该表示法特定于 Informix 及其 DECIMAL 和 MONEY 类型 — 据我所知,没有其他产品使用它。 Informix 还在其 DATETIME 和 INTERVAL 类型中使用它,但这是大部分的实现细节。

我一直都知道 on-disk 形式是 'excess-64' 而不是 'excess-65';我不确定哪个是正确的,但我认为 64 有一个坚实的基础。

'excess-6n'形式用于磁盘存储。它的好处是可以使用 memcmp() 比较磁盘格式中的两个十进制值以获得正确的比较(尽管 NULL 值必须单独处理——NULL 值总是会导致痛苦和悲伤)。

来自 ESQL/C(和 C-ISAM)的 decimal.h header 包含信息:

/*
 * 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。还要注意 'decimal' 在某些方面是用词不当;数据使用 'centesimal'(base-100)表示法表示。

这里有一些示例值、十进制表示以及 on-disk 格式的字节。请注意,在某种程度上,字节数是任意的。如果使用 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

以此类推