数值指某个数制系统下的所有数码以及正负号(±)和小数点(.)组成的数值,是相对其它非数值符号而言的,主要用于表示量的单位,通常数值可分为正数、0 和负数,也可分为小数和整数。
在计算机中数据只能通过电子信号模拟表示或通过电子元件组合模拟存储。
由于计算机只能识别 0 和 1 两种符号,所以像数学中的正负号(“+”、“-”)和小数点(“.”)这些符号其都无法识别,只能使用 0 或 1 来代替,由于 0 和 1 默认都表示数值,所以只能通过数位(数码的位置)来描述正负号或小数点,这个过程称为“符号的数字化”过程。
对于计算机来说,它只能看到 0 和 1,至于它表示多少,是逻辑层面的设置。你如果让它是 int
那就按照 int
表示法对每个位赋予意义,如果你让它是 float
就按照 float
表示法赋予意义。
无符号数
计算机中的无符号数指的是没有正负号(“+”、“-”)和小数点(“.”)的数,对应数学中的非负整数。
在计算机中 1 个字节等于 8 位,也就是说 1 字节可以表示 256 种不同的信息(每一位都由 0 和 1 数码随机排列组合,即得出 2^8=256
种不同的组合方式)。先假设 0 用 00000000
来表示,1 用 00000001
来表示,2 用 00000010
来表示,依次类推,可以得出其最大的数码为 11111111
,我们将其转换为十进制数值则分别为 0、1、2……255
。
事实上,数值的表示范围受机器本身处理能力(主要指 CPU 字长)限制,比如 8 位的 CPU 中,使用一个字节表示一个数值, 00000000
表示 0,00000001
表示 1,00000010
表示 2,依次类推,可以表示的无符号数范围为 0~2^8-1
;16 位的 CPU 中,最多可以使用两个字节表示一个数值,00000000 00000000
表示 0,00000000 00000001
表示 1,00000000 00000010
表示 2,依次类推,可以表示的无符号数范围为 0~2^16-1
;32 位 CPU 中,最多可以使用四个字节表示一个数值,可以表示的无符号数范围为 0~2^32-1
;64 位 CPU 中,最多可以使用八个字节表示一个数值,可以表示的无符号数范围为 0~2^64-1
。可以看出CPU字长越长,其表示的数据范围越大,当然计算就越精确,但是其计算速度会相应下降。
无符号数据使用与机器相关的位数来表示,范围为 0~2^n-1
( n 表示机器位数)。无符号数据在计算机中表示相对比较简单,给定一个无符号的二进制数码则可以轻松的转换为其对应的十进制数值。
有符号数
用二进制数码序列的最高位表示符号位,用来决定数值的正负形式;符号位上使用“0”表示正号(“+”),使用“1”表示负号“-”。由于二进制数码序列的最高位称为符号位,不具有实际数值意义,所以二进制数的形式值与其真值存在差异。
根据小数点位置的固定与否,有符号数又分为定点数和浮点数两种。
定点数
定点数的小数点位置固定不变
在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。称前者为定点小数,后者为定点整数。
定点整数 | 定点小数 | |
---|---|---|
小数点位置 | 最低位的右边 | 符号位的右边,最高位的左边 |
表示范围 | 0 ≤ |x| ≤ 2^n-1 | 2^(-n) ≤ |x| ≤ 1 -2^(-n) |
最小变化量 | 1 | 2^(-n) |
8 位字长 00000001 |
十进制 +1 |
十进制的 +2^(-7) ,即 0.0078125 |
8 位字长 10000001 |
十进制 -1 |
十进制的 -2^(-7) ,即 -0.0078125 |
浮点数表示
绝大多数现代的计算机系统利用科学计数法来表达浮点数,科学计数法为如下形式:
d.dd...d × β^e , (0 ≤ d < β)
其中 d.dd...d
为尾数,β
为基数,e
为指数。尾数中数字的个数称为精度,用 p(presion)
来表示。小数点左侧的数字不为 0。
二进制中的 β
为 2,d
为 0 和 1。
以 IEEE 754 标准为例来了解浮点数的表示方法
IEEE 754
标准定义了多种浮点格式,但最常见的是三种类型:单精度、双精度、扩展双精度,分别适用于不同的计算要求。一般而言,单精度适合一般计算,双精度适合科学计算,扩展双精度适合高精度计算。一个遵循 IEEE 754
标准的系统必须支持单精度类型(强制类型)、最好也支持双精度类型(推荐类型),至于扩展双精度类型可以随意。单精度浮点数是32位(即4字节)的,双精度(Double Precision)浮点数是64位(即8字节)的。
总位数 | 符号位数 | 指数位数 | 指数偏移 | 尾数位数 | 有效位数 | 隐含位 | |
---|---|---|---|---|---|---|---|
单精度 | 32 | 1 | 8 | 127 | 23 | 24 | 有 1 个隐含位 |
双精度 | 64 | 1 | 11 | 1023 | 52 | 53 | 有 1 个隐含位 |
指数位:用来确定小数点的位置。采用补码格式,这样就不用给阶码也留一个符号位,比较起来也简单。
指数偏移:在单精度中,用 0-000 0000
指数位表示指数 -127, 0-000 0001
表示 -126,1-111 1111
表示 128,所以指数偏移为 127
隐含位:二进制的科学计数法,整数位一定是 1,在尾数中隐藏,却会计入有效位数,因此有效位数比尾数位数多 1
以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式