定点数表示方法——原码,补码,反码,移码

1. 真值和机器数

真值:数的实际值,用正负号和绝对值的某进制形式来表示,如+1010,-12,-FFFF等.

机器数:真值在计算机中的二进制表示,特点是符号数字化且数的大小受机器字长限制,其表示形式有原码,补码,反码,移码等.

2. 原码.

1). 定点小数:

\[{x_{[{\rm{原}}]}} = \left\{ {\begin{array}{*{20}{l}}
{x,0 \le x < 1}\\
{{2^0} - x = {2^0} + \left| x \right|, - 1 < x \le 0}
\end{array}} \right.\]

(其中x[原]是机器数,x是真值,最高位为符号位,下同.)

表示范围:

\[\max = 1 - {2^{ - n}},\min = - (1 - {2^{ - n}})\]

(n是指x除符号位的位数,下同)

如: x=+0.1011, x[原]=0.1011

    x=-0.1011, x[原]=1.1011

2). 定点整数:

\[{x_{[原]}} = \left\{ \begin{array}{l}
x,0 \le x < {2^{\rm{n}}}\\
{2^n} - x = {2^n} + |x|, - {2^n} < x \le 0
\end{array} \right.\]

表示范围:

\[\max  = {2^n} - 1,\min  =  - ({2^n} - 1)\]

如:x=+1011,x[原]=01011

x=-1011,x[原]=11011

3). 特点:

原码实质上为符号位加上数的绝对值,0正1负;

原码零有两个编码,+0和 -0编码不同,表示不唯一;

原码加减运算复杂,乘除运算规则简单;

原码表示简单,易于同真值之间进行转换.

3. 补码

1). 定点小数:

\[{x_{[补]}} = \left\{ \begin{array}{l}
x,0 \le x < 1\\
2 + x = 2 - |x|, - 1 \le x \le 0
\end{array} \right.(\bmod 2)\]

表示范围:

\[\max  = 1 - {2^{ - n}},\min  =  - 1\]

如:x=+0.1011,  x[补]=0.1011

x=-0.1011, x[补]=10+x=10.0000-0.1011=1.0101

2). 定点整数:

\[{x_{[补]}} = \left\{ {\begin{array}{*{20}{l}}
{x,0 \le x < {2^{\rm{n}}},0 \le x < {2^n}}\\
{{2^{n + 1}} + x = {2^{n + 1}} - |x|, - {2^n} \le x \le 0}
\end{array}(\bmod {2^{n + 1}})} \right.\]

表示范围:

\[\max  = {2^n} - 1,\min  =  - {2^n}\]

如:x=+1011,x[补]=01011

x=-1011, x[补]=2^5 – |-1011|=100000 – 1011=10101

3). 特点

负数补码实质上为原码除符号位按位取反再加1

补码最高一位为符号位,0正1负;

补码零有唯一编码;

补码能很好用于加减运算;

补码满足x[补]+(-x)[补]=0;

补码最大的优点在于能够将减法运算转换成加法运算,其中符号位参与运算,它满足:

\[\begin{array}{*{20}{l}}
{{{(x{\rm{ }} + {\rm{ }}y)}_{\left[ 补 \right]}} = {\rm{ }}{x_{\left[ 补 \right]}} + {\rm{ }}{y_{\left[ 补 \right]}}}\\
{{{(x{\rm{ }} - {\rm{ }}y)}_{\left[ 补 \right]}} = {\rm{ }}{x_{\left[ 补 \right]}} + {\rm{ (}} - y{)_{\left[ 补 \right]}}}
\end{array}\]

例如:

\[\begin{array}{l}
x = {11_{[10]}} = {1011_{[2]}},y = {5_{[10]}} = {0101_{[2],}}\\
{(x - y)_{[补]}} = {x_{[补]}} + {( - y)_{[补]}} = 01011 + 11011 = 100110(溢出) = 00110 = {6_{[10]}} = x - y\;\;
\end{array}\]

4). 补码和原码转换.

正数:x[补]=x[原]

负数:按位取反,末位加1(符号位除外)

如:x= -1001001, x[原]=11001001,x[补]=10110110+1=10110111

5). 补码和真值的转换

\[{\rm{补码}}\left\{ \begin{array}{l}
{\rm{符号 = }}0{\rm{ - 正}},{\rm{余下为数值部分}}\\
{\rm{符号 = }}1{\rm{ - 负}},{\rm{余下求补为数值部分}}
\end{array} \right.\]

4. 反码

1). 定点小数

\[{x_{[{\rm{反}}]}} = \left\{ {\begin{array}{*{20}{l}}
{x,0 \le x < 1}\\
{(2 - {2^{ - n}}) + x = 2 + x - {2^{ - n}}, - 1 < x \le 0}
\end{array}} \right.\]

范围:

\[\max = 1 - {2^{ - n}},\min = - (1 - {2^{ - n}})\]

如:x=0.1011,x[反]=0.1011

x=-0.1011,x[反]=1.0100

2). 定点整数

\[{x_{[{\rm{反}}]}} = \left\{ {\begin{array}{*{20}{l}}
{x,0 \le x < {2^{\rm{n}}}}\\
{({2^{n + 1}} - 1) + x = {2^{n + 1}} + x - 1, - {2^n} < x \le 0}
\end{array}} \right.\]

范围:

\[\max  = {2^n} - 1,\min  =  - ({2^n} - 1)\]

如:x=1011,x[反]=01011

x=-1011,x[反]=10100

3). 特点

负数反码实质上为原码除符号按位求反,也就是补码-1;

反码零有两个编码,+0 和 -0 的编码不同;

反码难以用于加减运算;

反码的表示范围与原码相同.

5. 移码:用于表示浮点数的阶码

1). 定义

\[x[移] = {2^n} + x, - {2^n} \le x < {2^n}\]

范围:

\[\max  = {2^{n + 1}} - 1,\min  = 0\]

如:x=+1011,x[移]=11011

x=-1011,x[移]=00101

2). 特点

移码中符号位表示的规律与原码,补码,反码相反——"1"正"0"负;

移码为全0时所对应的真值最小,为全1时所对应的真值最大,移码的大小直观地反映了真值的大小,这有助于两个浮点数进行大小比较;

真值0在移码中的表示形式是唯一的;

移码把真值映射到一个正数域,所以可将移码视为无符号数,直接按无符号数规则比较大小;

同一数值的移码和补码除最高位相反外,其他各位相同.

3). 移码和补码转换

\[\begin{array}{l}
{x_{[补]}} = \left\{ \begin{array}{l}
x,0 \le x < {2^n}\\
{2^{n + 1}} + x, - {2^n} \le x \le 0
\end{array} \right.\\
{x_{[移]}} = {2^n} + x, - {2^n} \le x < {2^n}\\
{x_{[移]}} = \left\{ \begin{array}{l}
{x_{[补]}} + {2^n},0 \le x < {2^n}\\
{x_{[补]}} + {2^n} - {2^{n + 1}} = {x_{[补]}} - {2^n}, - {2^n} \le x \le 0
\end{array} \right.
\end{array}\]

时间: 2024-11-03 22:02:08

定点数表示方法——原码,补码,反码,移码的相关文章

原码 补码 反码

一.原码 正数的原码就是它的本身 假设使用一个字节存储整数,整数10的原码是:0000 1010 负数用最高位是1表示负数 假设使用一个字节存储整数,整数-10的原码是:1000 1010 二.反码 正数的反码跟原码一样 假设使用一个字节存储整数,整数10的反码是:0000 1010 负数的反码是负数的原码按位取反(0变1,1变0),符号位不变 假设使用一个字节存储整数,整数-10的反码是:1111 0101 三.补码(再次强调,整数的补码才是在计算机中的存储形式.) 正数的补码和原码一样 假设

原码补码反码

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> char stry[33] = { 0 }; char strf[33] = { 0 }; char strb[33] = { 0 }; void bcode(int num) { unsigned int data = 1 << 31;//左移31位 for (int i = 1; i <= 32; i++) { if (

JavaSE:命名规则、进制转换、原码补码反码、数据类型以及转换

1:关键字(掌握) (1)被Java语言赋予特定含义的单词 (2)特点: 全部小写. (3)注意事项: A:goto和const作为保留字存在. B:类似于Notepad++这样的高级记事本会对关键字有特殊颜色标记 2:标识符(掌握) (1)就是给类,接口,方法,变量等起名字的字符序列 (2)组成规则: A:英文大小写字母 B:数字 C:$和_ (3)注意事项: A:不能以数字开头 B:不能是java中的关键字 C:区分大小写 (4)常见的命名规则(见名知意) A:包 全部小写 单级包:小写 举

二进制的原码补码和反码

二进制的最高位为符号位,其中0表示正数,1表示负数: 正数的原码补码反码都是相同的: 负数的反码是负数的符号位不变,其余位取反(即1变0,0变1): 负数的补码是反码加1: 举例:计算机字长为八位,所以转换一下, 正一的原码:0000 0001 反码:0000 0001 补码:0000 0001 (均相同) 负一的原码:1000 0001(最高位的1表示为负数) 反码:1111 1110(最高位的符号位不变,其余取反) 补码:1111 1111(反码加一) 原文地址:https://www.cn

软件设计师考试笔记一:原码、反码、补码及移码

十进制小数转化为二进制小数的方法:对十进制小数乘以2得到的整数部分和小数部分,整数部分即是相应的二进制数码,再用2乘小数部分,结果再取整数部分,如此反复,直到小数部分为0或达到精度为止.第一次得到的为最高位,最后一次得到为最低位. 如计算+0.52的二进制: 1.0.52*2=1.04 (取整得到1) 2.0.04*2=0.08 (取整得到0) 3.0.08*2=0.16 (取整得到0) 4.0.16*2=0.32 (取整得到0) 5.0.32*2=0.64 (取整得到0) 6.0.64*2=1

机器数,原码,反码,补码,移码

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 在计算机中所有的数据的保存均是用二进制来实现的,而二进制的表示则是一串的0,1组成.而在计算机的表达中有着机 器数和原码,反码,补码和移码等数据的编码表示方法.其中这些编码的方法称为码制. (1).机器数 各种数据在计算机中的表示的形式称为机器数,其特点是数的符号用0.1来表示.机器数并不能算作真正的数值. (2).真值 机器数对于的实际数值称为该数的真值.也就是带符号的机器数(机器数是不带符号位的):机器数又分为无符号 数和有符号数

数据表示——原码、反码、补码、移码

到目前为止,我们学习了十进制.二进制.八进制.十六进制等用来代表实际数值的数,称为真值,这些数我们再日常生活中都会使用到,那么在计算机中数值是怎么来表示的呢? 数在计算机中的表示形式统称为机器数.计算机中处理数据及运算都是采用二进制,通常规定机器数用八位二进制表示.实用的数据有正数和负数,因为计算机只能表示0.1两种状态,数据的正号"+"或负号"-",在计算机里就用一位二进制的0或1来区别,通常放在最高位,成为符号位. 符号位数值化之后,为能方便的对机器数进行算术运

超简单的小例子揭开机器数的奥秘——原码、反码、补码、移码

各种数值在计算机中的表示形式称为机器数,机器数采用二进制数来表示数据,数据的正负号也分别用0和1来表示.为了便于运算,带符号的机器数可采用原码.反码.补码.移码等编码方法. 注:以下规则均以机器字长为8(即采用8个二进制位来表示数据)来举例说明. 原码 ⊙正数:如下图①先写上要表示的数据,②符号位(首位)写上0,③如果有空位则用0补上,如X=22=10110B,则[X]原=00010110: ⊙负数:如下图①先写上要表示的数据,②首位写上1,③如果有空位则用0补上,如X=-27=-11011B,

一张图看懂原码、反码、补码、移码

前言 原码.反码.补码其实两年前就讲过,只是当时的理解太过肤浅或者直接说就是没有理解,因为对于数学比较发怵的我看到那么多的公式很是脑袋大,所以想要硬记也记不住.这次讲课的时候好歹知道了运算规则,但别人一问为什么,立马那个冏啊~好了,废话不多说了,开始进入正题(如果我的理解有偏差,恳请各位大虾不吝指出): 一张图胜过千言万语,下面的这张是本篇想要说的大概内容 原码 我们知道,计算机是以0和1进行运算的,而且内部只有加法运算器,但日常生活中使用的却是十进制,并且有正负之分.于是我们发明了原码:最高位