什么是什么? · bei.pm
在这个栏目中,有关于文件格式和逆向工程的文章。
但事实是:
外面有很多编程语言,还有很多人对某些事物的称呼完全不同——或者根本不知道一些基本概念的存在,因为他们的编程语言对这些概念进行了抽象化处理。
简而言之:
我的符号大致遵循 C99 <stdint.h>
。如果你能理解这种符号,那么一定能适应我的符号。
整数
整数 通常是指没有小数部分的整数。
在数据格式中,整数通常在一个固定的数字范围内定义,几乎是一个分辨率。我用比特(bit)来表示这个范围,因为“字节(byte)”及其衍生类型(字(Word),四字(Qword)等)通常是平台相关的。
此外,整数类型还可以区分为 自然数 (ℕ,即无符号 - 无符号) 和 整数 (ℤ,即带符号 - 带符号)。
这个信息通过标识符中的符号(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) 范畴的数值,因此它们具有一个小数点和小数位。
在定点数值中,- 这也是名称的由来 - 小数点的位置是由数据类型固定规定的。
因此,这种数据类型的数值范围也是固定的;从数学上来说,数值范围是有限的。
在实际应用中,这种数据类型主要用于没有足够快速的浮点硬件单元的平台,因为定点数值的计算可以通过整数单元进行。
此外,这种数据类型还被数据库管理系统使用,当需要满足固定要求时。
例如,考虑用于永久存储金融数据的系统;大多数货币限制为小数点后两位。
(但使用定点数值并不明智;更聪明的方法是直接将最小货币单位作为整数存储,其余的表示层留给其他处理)
类似于整数表示,我在定点数值中指定小数点前和小数点后的位数:
ufixed(9,7)
表示一种数据类型,为小数点前的值保留无符号9位,为小数点后的值保留7位;总共宽度为16位,因此可以作为两个独立整数的向量,覆盖范围为(0,0)到(511,127)。
然而,这种解释在其十进制表示中会浪费28个数字,因为在实际应用中,可能更倾向于限制在最大(511,99)。
与定点数值作为两个分开的整数的直接解释相反,小数部分也可以解释为其整体分辨率的分数。
以刚刚提到的ufixed(9,7)
为例,分母为27 - 数值范围从0.00到511 + 126⁄127
因此,要转换为十进制表示,小数位需要除以128。
这种变体使得进行计算操作更简单,因为进位会自动产生,因此这种变体通常被优先使用。
然而,这种变体的缺点是小数位在十进制表示中不再有保证的分辨率,一个单独的小数位不再对应于0.01
,而是0.007874
,这将导致相应的舍入错误。
使用哪种解释方式将在使用地点进行相应的记录。
浮点数值
符号(0 或 1 ) |
指数 | 尾数 |
虽然符号作为二进制的是/否信息可以简单推导,但实际的数字是通过公式形成的
尾数 * 2指数
此外,还有一系列常量值,覆盖了特殊情况有理数 - 包括 ±∞
和 NaN
("无效数字")。
浮点数在精确度不是那么重要的情况下特别有用,因为这种类型的值不可避免地会导致舍入误差,从而造成精度损失。 通常,浮点数被用来定义坐标,例如3D模型中的顶点向量或用于光学表示目的的贝塞尔/样条曲线。
在数据格式中,浮点数被指定为 float(尾数, 指数)
。
如果使用的格式与IEEE 754不同,将相应地进行说明。