page contents

机器数和码制

计算机中的数据是以二进制补码的形式存储和运算的,想要理解机器数的运算就需要了解原码、补码和反码相关内容。

机器数和码制

各种数据在计算机中的表示称为机器数,其特点是采用二进制计数制,数的符号用0或1表示,小数点则隐含表示而不占位置。机器数对应的实际数值称为数的真值。

机器数有无符号和有符号之分。无符号数表示正数,在机器数中没有符号位只有数值位。有符号数的最高位为符号位,用于表示数值的正负,除最高位以外,其余位为数值位。小数点在机器数最低数值位之后的数为纯整数,小数点在机器数最高数值位之前的数为纯小数。

为了方便运算,有符号的机器数可采用原码、反码、和补码等不同的编码方法,机器数的这些编码方法称为码制。

 

1)原码表示法

数值X的原码记为[X]原,如果机器字长为n(即采用n个二进制位表示数据),则最高位位符号位,符号位为‘0’表示正号,符号位为‘1’表示负号,其余的n-1位表示此数值的绝对值。

数值零的原码表示有两种形式:

正零[+0]原=00000000,负零[-0]原=10000000

例:如果机器字长n等于8,则

[+1]原=00000001[-1]原=10000001

[+127]原=01111111[-127]原=11111111

[+66]原=01000010[-66]原=11000010

[+0.5]原=0.1000000[-0.5]原=1.1000000

 

2)反码表示法

数值X的反码记作[X]反,如果机器字长为n,则最高位是符号位,0表示正号,1表示负号,正数的反码与原码相同,负数的反码则是其绝对值按位取反。数值零的反码表示有两种形式:[+0]反=00000000,[-0]反=11111111。

例:如果机器字长n等于8,则

[+1]反=00000001[-1]反=11111110

[+127]反=01111111[-127]反=10000000

[+66]反=01000010[-66]反=10111101

[+0.5]反=0.1000000[-0.5]反=1.0111111

 

3)补码表示法

数值X的补码记作[X]补,如果机器字长为n,则最高位为符号位,正数的补码与其原码和反码相同,负数的补码则等于其反码的末尾加1。在补码表示中,0有唯一的编码:[+0]补=00000000,[-0]补=00000000。

例:如果机器字长n等于8,则

[+1]补=00000001[-1]补=11111111

[+127]补=01111111[-127]补=10000001

[+66]补=01000010[-66]补=10111110

[+0.5]补=0.1000000[-0.5]补=1.1000000

 

4)移码表示法

数值X的移码记作[X]移,移码表示法是在数X上增加一个偏移量来定义的,常用于表示浮点数中的阶码。如果机器字长为n,在偏移2n-1的情况下,只要将补码的符号位取反便可获得相应的移码表示。

例:如果机器字长n等于8,则

[+1]移=10000001[-1]移=01111111

[+127]移=11111111[-127]移=00000001

[+66]移=11000010[-66]移=00111110

[+0.5]移=1.1000000[-0.5]移=0.1000000

[+0]移=10000000[-0]移=00000000

机器数的运算

1、为什么要使用补码?

以整数运算1-1为例子:

码制

1

-1

1+(-1)

原码

0000 0001

1000 0001

1000 0010(-2)

反码

0000 0001

1111 1110

1111 1111(-0)

补码

0000 0001

1111 1111

0000 0000(0)

移码

1000 0001

0111 1111

0000 0000(+0)

 

2、补码加、减法

计算机中为了方便计算,所有数据都是以补码的形式存储的。

① 补码加法的运算规则是:和的补码等于补码求和,即[X+Y]补=[X]补+[Y]补。

② 补码减法的方法是:差的补码等于被减数的补码加上减数取负后的补码。在补码表示中,可将减法运算转换为加法运算,即[X-Y]补=[X]补+[-Y]补。

③ 由[X]补求[-X]补的方法是:[X]补的各位取反(包括符号位),末尾加“1”。

例:设二进制整数X=+1000100,Y=+1110,求X+Y、X-Y的值。

解:设用8位补码表示带符号数据,所以[X]补=01000100,[Y]补=00001110,[-Y]补=11110010。

attachments-2021-07-DvnkMZdS60ee935e24f06.png

 

由于X和Y都是正数,所以X+Y的值就等于[X]补+[Y]补,即X+Y=+1010010;由于X的绝对值大于Y的绝对值,所以X-Y的值就等于[X]补+[-Y]补,X-Y=+110110。

  • 发表于 2021-07-14 15:37
  • 阅读 ( 1455 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小威
小威

64 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章