原码,反码,补码及运算
- 格式:pdf
- 大小:5.00 MB
- 文档页数:9


原码、反码、补码、移码相互转换及其运算原码、反码、补码和移码的相互转换⼀、机器数 连同符号位⼀起数字化的数。
1.特点 ①符号数字化 ②数值的⼤⼩受机器字长的限制。
每个机器数所占的⼆进制位数受限于机器硬件规模,与机器字长有关。
超过机器字长的数位要被舍去。
2.真值:机器数中除“+”“-”符号外,其余部分表⽰的值。
3.分类 ①⽆符号数:机器字长的所有⼆进制位均表⽰数值。
②带符号数:数值部分和符号均为⼆进制代码表⽰,通常符号位位于最⾼位。
符号位“1”表⽰“-”,“0”表⽰“+”。
⼆、原码 原码是保持原有的数值部分的形式不变。
整数部分: 当0≤X<2n,[X]原=X [10011001]原= 010011001 当-2n<X≤0,[X]原=2n-X=2n+|X| [-10011001]原= 110011001 ⼩数部分: 当0 ≤ X<1,[X]原=X [0.10011001]原= 0.10011001 当-1<X ≤ 0,[X]原=1+|X| [-0.10011001]原= 1.110011001 ①将[X]原的符号取反即可得到[-X]原 【例题】设机器字长为8位,写出+37和-37的⼆进制。
解析:37得到的⼆进制数为100101,“+”为1,“-”为0,符号位在最⾼位 [+37]原=(+37)10=(+100101)2=(+00100101)2=00100101 [-37]原=(-37)10=(-100101)2=(-00100101)2=10100101 ②原码中0的表⽰不唯⼀ 整数原码:[+0]原=00...0 [-0]原=10 0 ⼩数原码:[+0]原=0.00...0 [-0]原=1.00 0 ③原码的移位规则:符号位不变,数值部分左移或右移,移出的空位归0。
左移是乘法,右移是除法。
移动n位是乘或除2n。
【例⼦】 [0.0110000]原=0.0110000 [0.0110000]原÷2=0.0011000 [0.0110000]原×2=0.1100000三、反码 ①反码与原码的关系 当X≥0,[X]反=[X]原 当X<0,[X]反=[X]原的位取反(符号位不变) 【例⼦】 [+0.1001100]反=0.1001100 [-0.1001100]反=1.0110011 [+1001100]反=01001100 [-1001100]反=10110011 ②反码中0的表⽰不唯⼀ [+0]反=00...0 [-0]反=11 (1)四、补码 补码的⽬的是使得减法也可以按照加法的⽅式来计算(加减法);同时,补码可以将数的符号位和数值域采⽤统⼀⽅式处理。
Java:⼆进制(原码、反码、补码)与位运算⼀、⼆进制(原码、反码、补码)⼆进制的最⾼位是符号位(“0”代表正数,“1”代表负数);Java中没有⽆符号数;计算机以整数的补码进⾏运算;1. 原码:将⼀个整数转换成⼆进制表⽰以 int 类型为例,int类型占4个字节、共32位。
例如,2 的原码为:00000000 00000000 00000000 00000010-2的原码为:10000000 00000000 00000000 000000102. 反码正数的反码:与原码相同负数的反码:原码的符号位不变,其他位取反例如,-2 的反码为:11111111 11111111 11111111 111111013. 补码正数的补码:与原码相同负数的补码:反码+1例如,-2 的补码为:01111111 11111111 11111111 11111110⼆、位运算Java中有4个位运算符:1. 按位与 &:两位都为1,结果为1 例如,2&3 = 2 2 的原码为: 00000000 00000000 00000000 00000010 3 的原码为: 00000000 00000000 00000000 00000011 2&3 原码为: 00000000 00000000 00000000 00000010 = 22. 按位或 |:⾄少⼀位为1,结果为1 例如,2|3 = 3 2 的原码为: 00000000 00000000 00000000 00000010 3 的原码为: 00000000 00000000 00000000 00000011 2|3 原码为: 00000000 00000000 00000000 00000011 = 33. 按位异或 ^:两位⼀个为1、⼀个为0,结果为1 例如,2|3 = 3 2 的原码为: 00000000 00000000 00000000 00000010 3 的原码为: 00000000 00000000 00000000 00000011 2^3 原码为: 00000000 00000000 00000000 00000001 = 14. 按位取反~:0变成1、1变成0 例如,~2 = -3 对2的原码取反:11111111 11111111 11111111 11111101 (取反后结果的补码,也就是-3的补码。
⼆进制原码,反码,补码的基础概念和计算⽅法⼀. 原码, 反码, 补码的基础概念和计算⽅法.1. 原码:原码就是符号位加上真值的绝对值, 即⽤第⼀位表⽰符号, 其余位表⽰值. ⽐如如果是8位⼆进制: [+1]原 = 0000 0001 [-1]原 = 1000 0001第⼀位是符号位. 因为第⼀位是符号位, 所以8位⼆进制数的取值范围就是:[1111 1111 , 0111 1111]即[-127 , 127]2. 反码反码的表⽰⽅法是: 正数的反码是其本⾝ 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反. [+1] = [00000001]原 = [00000001]反 [-1] = [10000001]原 = [11111110]反3. 补码补码的表⽰⽅法是: 正数的补码就是其本⾝ 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1 (即在反码的基础上+1) [+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补⼆. 为何要使⽤原码, 反码和补码计算机可以有三种编码⽅式表⽰⼀个数.对于正数因为三种编码⽅式的结果都相同:[+1] = [00000001]原 = [00000001]反 = [00000001]补但是对于负数:[-1] = [10000001]原 = [11111110]反 = [11111111]补机器可以只有加法⽽没有减法计算⼗进制的表达式: 1-1=0如果⽤原码表⽰:1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使⽤原码表⽰⼀个数. 如果⽤反码表⽰: 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. ⽤补码表⽰: 1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补 =[0000 0000]原 =0 这样0⽤[0000 0000]表⽰, ⽽以前出现问题的-0则不存在了.⽽且可以⽤[1000 0000]表⽰-128: (-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补 =-128注:-1-127的结果应该是-128, 在⽤补码运算的结果中, [1000 0000]补就是-128. 但是注意因为实际上是使⽤以前的-0的补码来表⽰-128, 所以-128并没有原码和反码表⽰.(对-128的补码表⽰[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的) 使⽤补码, 不仅仅修复了0的符号以及存在两个编码的问题, ⽽且还能够多表⽰⼀个最低数. 这就是为什么8位⼆进制, 使⽤原码或反码表⽰的范围为[-127, +127], ⽽使⽤补码表⽰的范围为[-128, 127]. (-1) + (-1) = [1000 0001]原 + [1000 0001]原 = [1111 1111]补 + [1111 1111]补 = [1111 1110]补 //负数原码=补码-1,再同位取反,符号位不变 =[1000 0010]原 =-2因为机器使⽤补码, 所以对于编程中常⽤到的32位int类型, 可以表⽰范围是: [-231, 231-1] 因为第⼀位表⽰的是符号位.⽽使⽤补码表⽰时⼜可以多保存⼀个最⼩值.。
原码、反码、补码、移码和数值计算欢迎访问我的个⼈站点,。
前⾔ 计算机的数值编码和运算应该是本科⼀年级就会学习的基础知识。
从软件开发这个⾓度来说,很多时候这些知识没有在开发过程中得到有效的利⽤和实践。
不巧,最近在做的⼀个项⽬,常常需要从补码的⾓度考虑数值表⽰和相关关系。
因此,也就趁此机会简单的写⼀写。
数值表⽰真值,机器数 机器数就是数值在计算机中的⼆进制表⽰,数值有正负之分,因此机器数⽤最⾼位来表⽰数值的符号,0 代表正数,1 代表负数。
根据表⽰⽅法不同,机器数分为:原码、反码、补码、移码等。
真值就是带正负的真实⼗进制值。
原码 原码很简单,就是最⾼位作为符号位,其余位表⽰真值的绝对值。
反码 正数的反码就是其原码本⾝,负数的反码则是原码除符号位外,其余位取反。
反码的运算⽅法为循环进位,即最⾼位的进位要加到最低位来。
如:8位为例:11111110(-1) + 11111110(-1) = 11111100 + 1 = 11111101(-2) 产⽣的原因:计算机的所有计算本质上都是加法,然⽽若正负值相加时让计算机判断符号位来选择运算⽅式会使得加法电路设计变得复杂,但是若直接让符号位参与运算则会带来1 + (-1) = -2 (8位为例:00000001 + 10000001 = 10000010)等等问题。
反码的提出就是为了解决符号位参与运算的加法问题。
补码 反码是⼀个不完美的解决⽅案,有不近⼈意的问题。
⽐如: 8位为例,00000000 和 11111111都可以表⽰零,⼀个+0,⼀个-0。
为了解决这个问题,引⼊补码来表⽰数值。
正数的补码是其原码本⾝,负数的补码是其反码 + 1 。
这个设计使得加法运算满⾜⼀个等式:a(补) + b(补) = (a + b)(补),由此,不管符号为何,直接参与运算都能得到正确的结果。
⽬前补码是最佳的解决⽅案。
现⾏的编程语⾔,都是⽤补码来表⽰数值和进⾏算数运算 设计的原理: 设计补码的原因是要解决表⽰反码表⽰ 0 的问题。