关于计算机编码及进制转换

目录

前言

一、计算机硬件

二、计算机中数据的表示

1.进位计数值及转换

2.二进制运算规则

3.机器数和码制

1.原码

2.反码

3.补码

4.为何要使用原码、反码和补码

总结


提示:本篇仅针对计算机运算器

前言

全国计算机技术与软件专业技术资格(水平)考试指南用书  学习心得!


一、计算机硬件

        基本的计算机硬件系统由运算器、控制器、存储器、输入设备和输出设备五大部分组成,随着网络技术的发展和应用,通信部件也成为计算机系统的基本组件。运算器和控制器及其相关部件已被集成在一起,统称为中央处理单元(CentralProcessing Unit, CPU).CPU是硬件系统的核心,用于数据的加工处理,能完成各种算术运算、逻辑运算及控制功能。

        运算器是对数据进行加工处理的部件,他主要完成算数和逻辑运算。


二、计算机中数据的表示

1.进位计数值及转换

        在采用进位计数的数字系统中,如果只用r个基本符号表示数值,则称其为r进制(Radix-r Number System),r称为该数制的基数(Radix)。不同的数制的共同特点如下。
        (1)每一种数制都有固定的符号集。例如,十进制数制的基本符号有十个:0,1,2,···,9。二进制数制的几倍呢符号有两个:0和1。
        (2)每一种数制都使用位置表示法。即处于不同位置的数符所代表的值不同,与他所在的位置的权值有关。例如,十进制数1234.55可表示为
        1234.55=1x10^3+2x10^2+3x10^1+4x10^0+5x10^-1+6x10^-2

计算机中常用的进位数制有二进制、八进制、十进制和十六进制。

1.十进制转二进制

        将十进制数转换成二进制数时,整数部分和小数部分分别转换,然后再合并。
十进制转换为二进制的方法是“除2取余”;小数则采用“乘2取整”
二进制转换成十进制的方法是“将二进制数的每一位数乘以它的权,然后相加,即可求得对应的十进制数值”。

十进制转二进制

2.十进制转八进制  

        二进制、八进制、十六进制数之间的对应关系如表所示

二进制、八进制、十六进制数之间的对应关系表

        十进制转换成八进制的方法是“除8取取整”;小数则采用“乘8取整”
二进制转换成八进制的方法是“从小数点起,每三位二进制分成一组(不足3位时在小数点左边是左边补零,在小数点右边时右边补0),然后写出每一组的等值八进制数,顺序排列起来就得到所要求的八进制数”。

3.十进制转十六进制

        十进制转换成十六进制的方法是“除16取余”;小数则采用“乘16取整”
二进制转换成十六进制的方法是“从小数点起,每四位二进制分成一组(不足4位时在小数点左边是左边补零,在小数点右边时右边补0),然后写出每一组的等值十六进制数,顺序排列起来就得到所要求的十六进制数”。

   

4.其他转换


2.二进制运算规则

(1)加法:二进制加法规则是“逢二进一”。
        0+0=0    1+0=1    0+1=1    1+1=0(有进位)
(2)减法:二进制减法规则是“借一当二”。
        0-0=0    1-0=1    1-1=0    0-1=1(有借位)
(3)乘法:
        0x0=0    1x0=0    0x1=0    1x1=1

3.机器数和码制

        各种数据在计算机中表示的形式称为机器数,其特点是采用二进制计数制,数的符号用0、1表示,小数点隐含表示而不占位置。机器数对应的实际数值称为数的真值。
对于带符号数,机器数的最高位是表示正、负的符号位,其余位则表示数值。若约定小数点的位置在机器数的最低数值位之后,则是纯整数;若约定小数点的位置在机器数的最高数值位之前(符号位之后),则是纯小数。无符号数是指全部二进制位均代表数值,没有符号位。
为了便于运算,带符号的机器数可采用原码、反码和补码、移码等不同的编码方法。

1.原码

(1)原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如:如果是8位二进制:
[+1]原= 0000 0001
[-1]原= 1000 0001
第一位是符号位,因为第一位是符号位,所以8位二进制数的取值范围就是:(即第一位不表示值,只表示正负。)
[1111 1111 , 0111 1111]即[-127 , 127]
原码是人脑最容易理解和计算的表示方式。

2.反码

(2)反码的表示方法是:
正数的反码是其本身;
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
[+1] = [0000 0001]原= [0000 0001]反
[-1] = [1000 0001]原= [1111 1110]反
可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。

3.补码

(3)补码的表示方法是:
正数的补码就是其本身;
负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(也即在反码的基础上+1)
[+1] = [0000 0001]原= [0000 0001]反= [0000 0001]补
[-1] = [1000 0001]原= [1111 1110]反= [1111 1111]补
对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码再计算其数值。

4.为何要使用原码、反码和补码

在开始深入学习前,我的学习建议是先"死记硬背"上面的原码,反码和补码的表示方式以及计算方法。
现在我们知道了计算机可以有三种编码方式表示一个数,对于正数因为三种编码方式的结果都相同:
[+1] = [0000 0001]原= [0000 0001]反= [0000 0001]补
所以不需要过多解释,但是对于负数:
[-1] = [10000001]原= [11111110]反= [11111111]补
可见原码,反码和补码是完全不同的。既然原码才是被人脑直接识别并用于计算表示方式,为何还会有反码和补码呢?
首先, 因为人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值区域的加减。(真值的概念在本文最开头) 但是对于计算机,加减乘数已经是最基础的运算,要设计的尽量简单,计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂!
于是人们想出了将符号位也参与运算的方法。我们知道,根据运算法则减去一个正数等于加上一个负数,即:1-1 = 1 + (-1) = 0, 所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。
于是人们开始探索将符号位参与运算,并且只保留加法的方法。

1.为什么使用原码

首先来看原码:
计算十进制的表达式: 1 - 1 = 0
1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [1000 0010]原= -2
如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的。这也就是为何计算机内部不使用原码表示一个数。

2.为什么使用反码

为了解决原码做减法的问题, 出现了反码:
计算十进制的表达式:1 - 1 = 0
1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]反+ [1111 1110]反= [1111 1111]反= [1000 0000]原= -0
发现用反码计算减法,结果的真值部分是正确的。而唯一的问题其实就出现在"0"这个特殊的数值上,虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。

3.为什么使用补码

于是补码的出现,解决了0的符号问题以及0的两个编码问题:
1-1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]补+ [1111 1111]补= [1 0000 0000]补=[0000 0000]补=[0000 0000]原注意:进位1不在计算机字长里。
这样0用[0000 0000]表示,而以前出现问题的-0则不存在了。而且可以用[1000 0000]表示-128:-128的由来如下:
(-1) + (-127) = [1000 0001]原+ [1111 1111]原= [1111 1111]补+ [1000 0001]补= [1000 0000]补
-1-127的结果应该是-128,在用补码运算的结果中,[1000 0000]补就是-128,但是注意因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示。(对-128的补码表示[1000 0000]补,算出来的原码是[0000 0000]原,这是不正确的)
使用补码,不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数。这就是为什么8位二进制,使用原码或反码表示的范围为[-127, +127],而使用补码表示的范围为[-128, 127]。
因为机器使用补码,所以对于编程中常用到的有符号的32位int类型,可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位,而使用补码表示时又可以多保存一个最小值。
 


总结

使用反码是为了进行减法运算

使用补码是为了防止0有两种表示方式,并用[1000000]补表示-128,所以-128没有原码和反码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初见Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值