CSP初赛复习-07-原码、补码、反码
CSP初赛复习-07-原码、补码、反码
计算机底层存储数据时,存储的是数据对应的二进制数字
基本概念
位(bit)
位是最基本的概念,在计算机中,由于只有逻辑0和逻辑1的存在,因此很多东西、动作、数字都要表示为一串二进制的字码
例如: 1001 0000 1101等等。其中每一个逻辑0或者1便是一个位。
例如这个例子里的1000 1110共有八个位,它的英文名字叫(bit),是计算机中最基本的单位
字节(Byte)
1个字节是由8个位组成的一个单元,也就是8个bit组成1个Byte
字长
计算机采用二进制编码方式表示数、字符、指令和其它控制信息。计算机在存储、传送或操作时,作为一个单元的一组二进制码称为字,一个字中的二进制位的位数称为字长。
字长是CPU的主要技术指标之一,指的是CPU一次能并行处理的二进制位数,字长总是8的整数倍,通常PC机的字长为16位(早期),32位,64位原码、反码、补码都是建立在机器数在一个字长上的表示。为了方便理解,我们假设字长为一个字节。要注意事实上为32位CPU字长为4个字节,64位CPU字长为8个字节。
原码、反码、补码
对于整型数据,二进制表示形式有三种:原码、反码、补码,而实际存储的是整型数据的补码
原码
首位为符号位,其余为真值
比如:

特点:简单。
范围:比如字长为8位,则范围为 11111111(-255)至 01111111(+255)。
缺点:0有两个表示,分别为正零(00000000)和负零(10000000),给计算机计算带来不便。
反码
首位为符号位
其它位分正数和负数两种情况。
正数反码:所有位和原码一样;
负数反码:除了符号位和原码一样,其他位相反。
比如:77的反码表示为01001101;-77的反码表示为10110010。
补码
分正数和负数两种情况。
正数补码:所有位和反码一样,当然也和原码一样。
负数补码:等于反码加1
比如:77的补码表示为01001101(和原码、反码一致);-77的补码表示为10110011。
加1之后会有进位,因为补码没有符号位,所以负零的补码表示也是00000000。
特点:表示比补码更麻烦。但是解决了一个问题:0只有一种表示。
| 原码 | 反码 | 补码 | |
|---|---|---|---|
| 正零 | 00000000 | 00000000 | 00000000 |
| 负零 | 10000000 | 11111111 | 00000000 |
补码加法:在计算机中,凡是带符号数一律用补码表示,运算结果自然也是补码。其运算特点是:符号位和数值位一起参加运算,并且自动获得结果(包括符号位与数值位)。
补码加法的运算规则为:

即:两数补码的和等于两数和的补码。
【例】已知 [+51]补=0011 0011,[+66]补=0100 0010,[-51]补=1100 1101;
求:[+66]补+[+51]补=?,[+66]补+[-51]补=?
【解】:
1 [+66]补+[+51]补=?
由于 [+51]补=0011 0011,[+66]补=0100 0010,

故 [+66]补+[+51]补=[(+66)+(+55)]补=01110101
结果为正,因此
[(+66)+(+55)]原=[(+66)+(+55)]补=01110101
其真值为+117,计算结果正确。
2 [+66]补+[-51]补=?
由于 [+66]补=0100 0010,[-51]补=1100 1101,

补码的意义
人脑可以知道最高位是符号位,在计算的时候就会根据符号位进行加减
计算机,加减乘除已经是最基础的运算,因此要设计得尽量简单,而让计算机辨别符号位会让计算机的基础电路设计变得复杂。
于是人们开始探索将符号位参与运算,并只保留加法的方法
根据运算法则,减去一个数等于加上这个数的负数,即 1 - 1 = 1 + (-1)
1使用原码运算
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2
让符号位也参与运算时,使用原码,对于减法运算来说,结果是不正确的。这也是计算机内存在存储数据时不使用原码的原因。为了解决这一问题,就出现了反码
2 使用反码运算
1 - 1 = 1 + (-1) = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 000]原 = -0
使用反码的问题在于 0 的符号是负号,而且 [0000 0000]原 和 [1000 0000]原 都表示 0。为了解决这一问题,就出现了补码
3 使用补码运算
1 - 1 = 1 + (-1) = [0000 0001]补 + [1111 1111]补 = 1(舍去)[0000 0000]反 = [0000 0000]原 = 0
这样就不存在 -0 的问题了
数的定点表示和浮点表示
计算机中数据有两种表达方式:定点数和浮点数
定点数
定点数是隐含小数点的位置
定点整数
点整数是将小数点位置固定在数值的最右端,符号位右边的所有位表示整数的数值
例如:
[00011001]原码,实际是表示+0011001
定点小数
定点小数是将小数点固定在数值的最左边,符号位右边的所有位表示小数的数值
[00011001]原码,实际是表示 +0.00011001
定点数可以表示纯小数和整数,定点整数和定点小数在计算机中的表示形式没有什么区别,小数点的位置完全靠事先隐含约定在不同的位置
浮点数
浮点数是指小数点位置不固定的数,它既有小数部分又有整数部分。
在计算机中通常把浮点数分成阶码(也叫指数)和尾数两部分,
其中阶码用二进制定点整数表示,尾数用二进制定点小数表示,阶码的长度决定数值的范围,尾数的长度决定数值的精度
例如:
-1234.5678 可以表示为:
-1.2345678×10+3、-12.345678×10+2、-123.45678×10+1、-12345.678×10-1、-1234567.8×10-3
如果规格化要求是0.1≤|尾数|<1,则机器取-0.12345678×10+4形式存放
CSP初赛复习-07-原码、补码、反码-练习题
https://www.cnblogs.com/myeln/articles/17545718.html
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号