正负数的源码、反码、补码相互转换

一、正数

  正数的源码、反码、补码都是相同的。

二、负数

 1、负数的源码与反码的相互转换

    负数的源码转换为反码:符号位不变,数值位按位取反。

    例如: 

源码:1000 1100
反码:1111 0011

    负数的反码转换为源码:符号位不变,数值位按位取反。

    例如:

反码:1011 0101
源码:1100 1010

 2、负数的源码和补码的相互转换

   负数的源码转换为补码:1、先转换为反码(符号位不变,数值位按位取反)2、在补码的基础上末位加一。

       例如:

源码:1010 0101
反码:1101 1010
补码:1101 1011

   负数的补码转换为源码:符号位不变,数值位按位取反,末位加一。

   例如:

补码:1110 1011
补码取反:1001 0100
源码:1001 0101

3、负数的反码和补码的相互转换

   负数的反码转换为补码:末位加一

     例如:

反码:1100 1110
补码:1100 1111

     负数的补码转换为反码(源码的反码):末位减一

     例如:

补码:1100 1110
反码:1100 1101 (借位减)

4、正数取反

  先将正数源码按位取反,得到一个负数,由于负数以补码形式存在,再转换为负数的反码,最后末位加一得到补码。

  例如:

0000 1100 #源码
1111 0011 #正数取反得到负数的源码
1000 1100 #负数的源码取反后得到反码
1000 1101 #反码加一得到补码

5、计算机存储数据以补码的形式(原文链接:https://blog.csdn.net/evinsyx/article/details/79559863

数据是以一串二进制的数字储存在计算机中,而数据转化为二进制的数值就是称为原码。比如说整数10的原码为0000 1010(八位二进制),其中最左边的一位作为符号位,值为0即为正数,值为1为负数。

但是如果直接以原码的形式存在计算机中,那么为引来一个bug: -0和+0的原码形式不统一,-0的原码为1000 0000,而+0的原码为+0000 0000。但是在数学上-0和+0的意义应该是一样的,均为0。

这还不是计算机不以原码储存的一个原因,另外一个原因就在于计算机它只能做加法运算,所以计算机的减法运算还要转化成加法运算来实现。那通过什么办法实现呢。

平时日常生活所用到的时钟,我们可以把时钟的时间值看做是十二进制的一种计数器(比如1点钟和13点钟的时针指的是同一个值),所以说 5 - 3  = 2 。 这个式子可以看作是五点钟逆时针转了3个钟到了2点钟。 我们可以把式子变一下, 5 - 2 = 5 + ( 12 - 2 ) = 15 = 3 (这里15 = 3 是因为 15点的时钟指的是3点钟,也可以看成15超过了12,所以舍去了12变成了3)。

所以在这里我们引出一个概念,这里的容量12被称为模,我个人认为模应该是指在一种数学环境中数可选的容量,就像二进制中的模为2。而上面的推断也启示了我们可以将减数变成模减去减数的绝对值,然后和被减数相加得到原本减法的结果。所以我们可以在原码中,把正数的原码不变,负数的原码通过模减去这个原码得到的一串新的二进制数字串,称作补码(根据规定,我们将正数的补码等于原码)。比如说-3的原码为1000 0011,而八位二进制数的模为1 0000 0000,所以其补码为1 0000 0000 - 1000 0011 = 1111 1101,即1111 1101是-3的补码。

我们可以吧这个运算过程转化一下 1 0000 0000 - 1000 0011 = 1111 1111 - 1000 0011 + 0000 0001,把式子转化成这样子后,由于1111 1111 - 1000 0011的运算就跟把1000 0011的所有位数的值取反一样,而取反得到的原码则被称为反码(在规定中,正数的反码等于原码,而负数取反过程中其符号位不变,所以可能会与之前讲的求补码的过程有冲突,而作者在之前的例子会出现改变符号位的可能,所以按照规定还是保持符号位不变,其他位取反),所以上式子中,1000 0011的反码就是为0111 1100。接下来在原先求负数补码的过程中,我们将式子化成1111 1111 - 1000 0011(在取反) + 0000 0001,那么在这种求负数补码的过程也可以是将负数原码取反后再加一,这也是一般求负数补码的方法。

而有了补码这种概念后,我们会发现+0的补码是0000 0000,而-0的原码为1000 0000,通过取反加一后我们会发现-0的补码竟然也是0000 0000,正好解决了会出现两个零的可能,而且其中-128的补码是1000 0000(可以带入式子算,其中-128的原码也为1000 0000,所以可以算出其补码正好为1000 0000)。所以补码能够使每个数一一对应,这也是计算机储存数据使用补码而不是用原码。

原文地址:https://www.cnblogs.com/zh-dream/p/11663569.html

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

正负数的源码、反码、补码相互转换的相关文章

正负数的源码 反码 补码 转

首先提几个概念: 原码,反码,补码 原码是什么? 原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码.负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码 举例说明: int类型的 3 的原码是 11B(B表示二进制位), 在32位机器上占四个字节,那么高位补零就得: 00000000 00000000 00000000 00000011 int类型的 -3 的绝对值的二进制位就是上面的 11B 展开后高位补零就得: 10000000 00000000 000

c/c++原码反码补码原理 以及进制转换

1首先了解 低字节位 和高字节位 看图 2字节在内存的排列方式  //int num = 010; //0开头代表 8禁止  //("%d",num); //所以打印的是8  int num = 0x12345678;  //将占 2 32位  printf("%p", &num);   /*  要特别 注意 低位 在低字节 高位  高字节  0x0063FAC0  78  x  0x0063FAC1  56  V  0x0063FAC2  34  4  0

原码 反码 补码 以及 为什么要使用原码反码补码

原始博文网址,无意侵权,只是想记下来以后复习的时候方便, http://www.cnblogs.com/cumtchw/p/4523332.html http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数,机器数是带符号的,在计算机中用一个数的最高位存放符号,正数为0,负数为1,比如,十进制中的+3,假设计算机字长为8位,转换成二进制就是0000 0

java原码,反码,补码 位运算

原码是什么?反码是什么?补码是什么? 原码:正数:正数转换为二进制位就是这个正数的原码负数:负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码 int 2 原码: 00000000 00000000 00000000 00000010 int -2 原码:10000000 00000000 00000000 00000010 00000000 00000000 00000000 00000011 # 3原码10000000 00000000 00000000 00000011 # -3原

原码, 反码, 补码 详解以及负数的按位与运算

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算

02进制_原码反码补码

###02.03_Java语言基础(不同进制数据的表现形式)(掌握)* A:二进制的数据表现形式 * 由0,1组成.以0b(b可以大写也可以小写)开头(JDK1.7版本可以表示二进制了)* B:八进制的数据表现形式 * 由0,1,-7组成.以0开头* C:十进制的数据表现形式 * 由0,1,-9组成.整数默认是十进制的 * D:十六进制的数据表现形式 * 由0,1,-9,a,b,c,d,e,f(大小写均可).以0x开头 * E:案例演示 * 输出不同进制表现100的数据. * 0b100 * 0

原码 反码 补码

出处来自:http://blog.csdn.net/liushuijinger/article/details/7429197 原码: 如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1.剩下的n-1位表示概数的绝对值. 例如: X=+101011 , [X]原= 00101011    X=-101011 , [X]原= 10101011 位数不够的用0补全. PS:正数的原.反.补码都一样:0的原码跟反码都有两个,因为这里0被分为+0和-0.

[C++基础]原码/反码/补码、二进制位运算

原码/反码/补码 编码 定义 实例 原码 最高位为符号位,"0"表示正,"1"表示负,其余位表示数值的大小. [+100]原=01100100 [+0]原=00000000 [-100]原=11100100 [-0]原=10000000注意:在原码中,零有两种表示形式. 反码 正数的反码与其原码相同:负数的反码是对其原码逐位取反,但符号位除外. [+100]反=01100100 [+0]反=00000000 [-100]反=10011011[-0]反=1111111

计算机中的原码,反码,补码与移码

在计算机内,定点数有3种表示法:原码.反码和补码. 原码:就是二进制定点表示法,即最高位为符号位,0表示正,1表示负,其余位表示数值的大小 反码:正数的反码与其原码相同:负数的反码是对其原码逐位取反,但符号位除外.       原码10010=反码11101(10010,1为符号位,故为负) 补码:正数的补码与原码相同,负数的补码是对其原码逐位取反,但符号位除外,然后整个数加1 如果补码的符号位为0,则表示一个正数,其原码就是补码如果补码的符号位为1,则表示一个负数 移码:移码与补码的关系: [