在计算机内部,信息是以 0 和 1 组成的各种编码的形式存在的
6.1 无符号数和有符号数
在计算机中,参与运算的数分为两大类 :无符号数 、有符号数
6.1.1 无符号数
计算机中的数,都存放在寄存器中,通常称 "寄存器的位数" 为 "机器字长"
无符号数,就是没有符号的数;在寄存器中的每一位都可用来存放数值(一个位,可用于保存一个二进制码元 0 或 1)
当存放有符号数时,则需要留出位置存放符号('+' 或 '-')
因此,当机器字长相同时,无符号数和有符号数所对应的数值范围不同;以机器字长 16 位为例,无符号数的表示范围为 0 ~ 65535 ;而有符号数的表示范围为 -32768 ~ +32767
6.1.2 有符号数
1. 机器数与真值
对有符号数来说,机器无法识别符号的 "+" 和 "-",但由于 "+" 和 "-" 正好是两种不同的状态,如果用 "0" 表示 "+",用 "1" 表示 "-",则符号也被数字化了,并且规定将符号化的数字放在有效数字的前面,即组成了有符号数
示例:
把符号数字化的数,称为 "机器数"
把带 "+" 或 "-" 符号的数,称为 "真值"
一旦符号数字化后,符号和数值就形成了一种新的编码;在运算过程中,符号位能否和数值部分一起参与运算?如果参加运算,符号位又需要作哪些处理?这些问题都与符号位和数值位所构成的编码有关,这些编码就是原码 、补码 、反码 、移码
2. 原码表示法
2. 原码表示法 | ||
原码概述 | 原码是机器数中最简单的一种表示形式,符号位 0 表示正数,符号位 1 表示负数,数值位即真值的绝对值,所以原码表示也称 "带符号的绝对值表示" | |
整数原码 与 小数原码 | 为了书写方便以及区分整数和小数,故规定 : (i). 整数的符号位与数值位之间用逗号( , )隔开 (ii). 小数的符号位与数值位之间用小数点( . )隔开 | |
示例回顾 | 前面的 4 个数的原码分别是 0.1011 、1.1011 、0,1100 、1,1100 | |
整数原码表示法 | [ x ] = = | |
说明 :x 为真值,n 为二进制整数的位数(真值中 0 或 1 的个数) | ||
整数原码示例 | 当 x = +1110 时,[ x ]原 = 0,1110 当 x = -1110 时,[ x ]原 = | |
小数原码表示法 | [ x ] = x = 1 - x | |
x 为真值 | ||
小数原码示例 | 当 x = 0.1101 时, [ x ]原 = 0.1101 当 x = -0.1101 时,[ x ]原 = 1 - (-0.1101) = 1.1101 | |
小结 | 已知真值可求原码,已知原码可求真值 | |
真值 、原码 转换示例 | 例一: 当 [ x ]原 = 1.0011 (符号位是 1 ,为负数,小数点隔开为小数,用公式 [ x ]原 = 1 - x ) x = 1 - [ x ]原 = 1 - 1.0011 = -0.0011 例二: 当 [ x ]原 = 1,1100 (符号位是 1,为负数,逗号隔开为整数,用公式 [ x ]原 = x = 例三: 当 [ x ]原 = 0.1101 时 (符号位是 0,为正数,小数点隔开为小数,用公式 [ x ]原 = x ) x = 0.1101 | |
原码中的零 | 当 x = 0 时 [ +0.0000 ]原 = 0.0000 [ -0.0000 ]原 = 1 - (0.0000) = 1.0000 可见,[ +0 ]原 不等于 [ -0 ]原 ,即原码中的 "零" 存在两种表示形式 | |
原码优点 | 表示简单明了,易于和真值转换 | |
原码缺点 | 使用原码进行加减运算时,带来了许多麻烦;当两个操作数符号不同且要做加法运算时,先要判断两个数绝对值大小,绝对值大的数减去绝对值小的数,结果的符号以绝对值大的数为准 |
3. 补码表示法
3.1 补数的概念
在日常生活中,常会遇到 "补数" 的概念;例如,时针指向 6 点,欲使时针指向 3 点,分针可以顺时针方向转 9 圈,分针也可以逆时针方向转 3 圈,结果是一致的;假设顺时针方向转为正,逆时针方向转为负,则有
6 - 3 = 3 , 6 + 9 = 15
由于时钟的时针转一圈指示 12 个小时,这个 "12" 在时钟里是不被显示而自动丢失的,即 15 - 12 = 3 ,故 15 点和 3 点均显示 3 点;这样 -3 和 +9 对时钟而言,其作用是一致的;
在数学上,称 12 为 "模" ,写作 mod 12 ,称 +9 是 -3 以 12 为模的补数,记作