编码世界探秘:原反补码与实数表示,含定点、浮点及BCD编码

数值的编码表示

整数编码表示

在计算机中,因为只有0和1这两种形式,但为了表示数的正(+),负(-)号,就要将数的符号以0和1编码。

通常把一个数的最高位定义为符号位,用0表示正,1表示负,称为数符,这种把数本身(数值部分)及符号一起数字化的数称为机器数。

机器数是数在计算机内的表示形式,而这个数真正表示的数值称为真值

假设计算机字长为8,然后介绍它的原码、反码和补码

原码

整数 X 的原码指其数符位 0 表示正,1 表示负。其数值部分就是X绝对值的二进制表示。

通常用 [X] ~原~表示X的原码

示例:

  • [ +1 ]~原~=00000001 [ +127 ]~原~=01111111
  • [ -1 ]~原~=10000001 [ -1 ]~原~=11111111

由此可知,8位原码表示的最大值为2^7^-1,即是127,最小值为---127,所能表示数的范围为[-127,127]

当采用原码表示时,编码简单,与真值转换方便。但原码也存在以下一些问题

  • 在原码表示中,0有两种表示形式,即 [ +0 ]~原~=00000000,[ -0 ]~原~=10000000。零的二义性给机器判断带来了麻烦
  • 原码进行四则运算时,符号位需要单独处理,增加了运算规则的复杂性

反码

整数X 的反码指对于正数,与原码相同;但对于负数,数符位为1,其数值位是X的绝对值取反。通常用 [X ]~反~表示 X 的反码

示例:

  • [ +1 ]~反~=00000001 [ +127 ]~反~=01111111
  • [ -1 ]~反~=11111110 [ -127 ]~反~=10000000

由此可知,8位反码表示的最大值、最小值和所能表示数的范围与原码相同。

反码运算也不方便,很少使用,一般用作求补码的中间码

补码

正数 X 的补码指对于正数,与原码、补码相同;但对于负数,数符位为1,其数值位是X的绝对值取反后再在最低位加1,即为反码加1

通常用 [ X ]~补~表示 X 的补码

示例:

  • [ +1 ]~补~=00000001 [ +127 ]~补~=01111111
  • [ -1 ]~补~=11111111 [ -127 ]~补~=10000001

在补码表示中,0有唯一的编码,即[ +0 ]~补~=[ -0 ]~补~=00000000,因而可以用多出来的一个编码10000000来扩展补码所能表示的数值范围,即将负数由最小-127扩大到-128。这里的最高位1即可看作符号位,又可表示为数值位,其值即为-128,补码所能表示数的范围为[-128,127]。这就是补码与原码、反码最小值不同的原因。利用补码可以方便地进行运算

总结

对于正数 X:[ X ]~原~=[ X ]~反~=[ X ]~补~

对于反数 Y:

  • [ Y ]~原~=数符位为1,其他位为绝对值的二进制形式;
  • [ Y ]~反~=数符位为1,其余位按位取反
  • [ Y ]~补~=[ Y ]~反~+1

实数编码表示

在计算机中小数点是不占位置的,因此规定根据小数点所在的位置来表示,分别为定点整数、定点小数和浮点数这三种表示形式

定点整数

定点整数是纯整数,是指在计算机内部表示时,小数点被固定在机器数的最右边。定点整数可分为有符号数和无符号数(正整数)。

  • 有符号数最高一位二进制表示符号(0表示正号且1表示负号),其余各位表示数据。

  • 不带符号位时所有的二进制位数都用来表示数据

无符号整数的表示

字长为n位的计算机,它能表示的无符号整数的范围是0~2^n^-1

字长为8位的计算机,它的整数范围是:0~255(00000000B~11111111B)

字长为16位的计算机,它的整数范围是0~65535(0000000000000000B~1111111111111111B)

有符号整数的表示

字长为n位的计算机,它能表示的有符号整数的范围是-2^n-1^~2^n-1^-1

最高位表示符号,0表示正号(+),1表示负号(-),其余用来表示数值部分。

数值部分的表示方法

  • 原码表示

    整数的绝对值以二进制自然码表示

    如字长为8位的计算机中,[ +20 ]~原~=00010100 [ -20 ]~原~=10010100

    字长为n位的计算机,能表示的有符号整数的范围是-2^n-1^~2^n-1^-1

    字长为8位的计算机,有符号整数的范围是:-127~+127(10000000B~01111111B)

    字长为16位的计算机,有符号整数的范围是:-32767~+32767.

  • 补码表示

    正整数的绝对值以二进制自然码表示,负整数的绝对值使用补码表示

    [ +20 ]~补~=00010100 [ -20 ]~补~=11101011

定点小数

定点小数是纯小数,是指在计算机内部中固定小数点位置在符号位与有效数值部分之间。

所有数绝对值均小于1

浮点数

所谓浮点数是指小数点位置不固定的值。定点数表示的数在实际应用中是不够用的,尤其在科学计算中。为了能表示非常大或非常小的数,采用浮点数表示。

浮点数主要由符号位(正负)、阶码和尾数(有效数字)这三个部分组成:

  • 符号位:用来表示数值的正负,通常是最高位的数码,0表示正数,1表示负数
  • 阶码(指数):用定点整数来表示,存储实际指数值,阶码所占的位数确定了数的范围
  • 尾数:用定点小数表示,存储小数部分的有效数字。尾数所占的位数确定了数的精度

如:-0.2368*10^+3^,其中-是符号位,0.2369是尾数,+3是阶码(尾数)

浮点数的表示方法和科学计数法相似,任意一个数均可通过改变其指数部分,使小数点发生移动,如十进制数23.89可以表示为2.368x10^1^、0.2368x10^2^、0.02368x10^3^等。

在计算机中,浮点数的一般表示形式为N=2^E^xD,其中,D称为尾数,E称为阶码。

BCD编码

BCD(Binary-Coded Decimal,二进制编码的十进制)是一种将十进制数以二进制形式编码的方法,它确保每一位二进制编码仅能表示0到9之间的单个十进制数字。

当十进制小数转换为二进制数时会产生误差,为了精确地存储和运算十进制数,可用若干位二进制数码来表示一位十进制数,称为二进制编码的十进制数。

BCD编码的主要目的是为了简化计算机系统中十进制数据的处理,尤其是对于那些需要精确十进制表示的应用场景,比如金融和会计系统

在BCD编码中,一个十进制位通常用4位二进制来表示,因为2的4次方等于16,而10进制数正好在0到9这个范围内。BCD码可分为8421码(从高位到低位的权值分别为8、4、2、1)、2421码(从高位到低位的权值分别为2、4、2、1)、5421码(从高位到低位的权值分别为5、4、2、1)等。8421最基本的,最常用的BCD码。

8421该怎么计算?

示例:用8421法将十进制5转换为二进制数

按照8421来分解5:5=4+1

用8421转换法,对应数字的下面写1,没有的写0,得到:

所以:5D=0101B

常用BCD码与十进制数的对应关系如表1-11所示

十进制数 8421码 5421码 2421码
0 0000 0000 0000
1 0001 0001 0001
2 0010 0010 0010
3 0011 0011 0011
4 0100 0100 0100
5 0101 1000 1011
6 0110 1001 1100
7 0111 1010 1101
8 1000 1011 1110
9 1001 1100 1111

如果要表示更大的十进制数,只需将每个十进制位转换为相应的BCD码,并按顺序排列起来。例如,十进制数123可以表示为:

  • 十进制数 1 对应的 BCD 码是:0001
  • 十进制数 2 对应的 BCD 码是:0010
  • 十进制数 3 对应的 BCD 码是:0011

所以,十进制数123的BCD编码就是:0001 0010 0011。

使用BCD编码的优点在于可以直接读取并理解其表示的十进制数值,避免了二进制与十进制之间转换时可能引入的精度损失。然而,相对于原生二进制表示,BCD编码占用的空间较大。

相关推荐
小李小李不讲道理10 小时前
行动+思考 | 2024年度总结
前端·程序员·年终总结
聪小陈1 天前
圣诞节:记一次掘友让我感动的时刻
前端·程序员
百万蹄蹄向前冲2 天前
2024不一样的VUE3期末考查
前端·javascript·程序员
陈哥聊测试3 天前
软件格局在变,谁能扛起国产替代的大旗?
安全·程序员·产品
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭3 天前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
少年姜太公3 天前
从零开始详解js中的this(下)
前端·javascript·程序员
凌虚3 天前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
小华同学ai3 天前
ShowDoc:Star12.3k,福利项目,个人小团队的在线文档“简单、易用、轻量化”还专门针对API文档、技术文档做了优化
前端·程序员·github
小青鱼6 天前
AI编程-Cursor从入门到精通系列之常用概念及解释(二)
人工智能·程序员
捡田螺的小男孩6 天前
参数校验的十个建议!收藏好,别再给测试机会提bug~
java·后端·程序员