原码 反码 补码 位运算符

原码 

原码是电脑运算的名词,是指“未经更改”的码。为了便于ALU(算术逻辑单元)的设计,又发展出反码、补码等转换过的码。

原码是指一个二进制数左边加上符号位后所得到的码,且当二进制数大于0时,符号位为0;二进制数小于0时,符号位为1;二进制数等于0时,符号位可以为0或1(+0/-0)。

计算机中所有的数均用0、1编码表示,数字的正负号也不例外,如果一个机器数字长是n位的话,约定最左边一位用作符号位,其余n-1位用于表示数值。

原码是最简单的编码方式,便于输入输出,但作为代码加减运算时较为复杂。一个字长为n的机器数能表示不同的数字的个数是固定的2^n个。当  n=8时,能表示256个数字。

有符号数:

用来表示有符号数,数的范围就是 -(2^{n-1}-1)~ +(2^{n-1}-1)} 。当n=8时,这个范围就是 -127~ +127。

无符号数:

在不需要考虑数的正负时,就不需要用一位来表示符号位,n位机器数全部用来表示是数值,这时表示数的范围就是 0 ~ 2^{n}-1。当 n=8时,这个范围就是 0~ 255。

原码的优点:

简单直观,我们用8位二进制表示一个数,则+11的原码为00001011,-11的原码就是10001011。

    5 => 0b101,     1 => 0b1,      -1=> -0b1

原码的缺点:

原码不能直接参加运算,可能会出错。例如数学上,1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。显然出错了。

所以原码的符号位不能直接参与运算,必须和其他位分开,这就增加了硬件的开销和复杂性。



反码

将二进制数反转,得到的数即为原二进制的反码(ones' complement)。若某一位为0,则使其变为1,反之亦然。

一个数的反码在很多算术运算中的表现与这个数的相反数很相似,此特性可使加法电路同时可以运算减法。然而,由于反码中存在多余的负零和其它问题,反码并未像补码一样被广泛应用。

    正数的反码与原码相同;负数的反码符号位不变其余取反

例如,+3是0011,用反码表示-3便是1100。 

 下表列出了4-bit二进数所能表示的整数。


原码 反码 补码 位运算符_第1张图片

补码

补码(英语:2's complement)是一种用二进制表示有号数的方法,也是一种将数字的正负号变号的方式。

一个数字的补码就是将该数字作比特反相运算(即反码),再将结果加1。在补码系统中,一个负数就是用其对应正数的补码来表示。

补码系统的最大优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路及补码电路即可完成各种有号数加法及减法,在电路设计上相当方便。

另外,补码系统的0就只有一个表示方式,这点和反码系统不同(在反码系统中,0有二种表示方式),因此在判断数字是否为0时,只要比较一次即可。

    正数的补码与原码相同;负数的补码 符号位不变 其余 按位取反 后 +1


原码 反码 补码 位运算符_第2张图片
8-bit补码系统的整数。它可表示的范围包括-128到127,总共256(=2^8)个整数。

负数表示法

    数字电路的CPU中的运算器实现了加法器,但是没有减法器,减法是转换成加法

    负数在计算机中使用补码存储,-1的补码为1111 1111

    5 - 1 => 5 +(-1)直觉上是0000 001 - 0b0000 0001,其实计算机中是0000 0101+11111111,溢出位舍弃



位运算符

a 为 60,b 为 13

a = 0011 1100

b = 0000 1101

” 按位异或 运算符:当两对应的二进位相异时,结果为1

(a ^ b) 输出结果 49 ,二进制解释: 0011 0001

“ 按位或 运算符:只要对应的二个二进位有一个为1时,结果位就为1。

(a | b) 输出结果 61 ,二进制解释: 0011 1101

“ 按位与 运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0

(a & b) 输出结果 12 ,二进制解释: 0000 1100

按位取反 运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1

(~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。

<< ” 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。

a << 2 输出结果 240 ,二进制解释: 1111 0000

>>右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数

a >> 2 输出结果 15 ,二进制解释: 0000 1111



问题一:~12为什么是 -13?

    12的原码:0000 1100

    按位取反:1111 0011

    反码的补码:1000 1101 = -13

问题二:10^9 等于? 10^-9等于?

10的原码:0000 1010   

 9 的原码:0000 1001  

-9 的原码:1000 1001

      10^9 =  0000 0011 = 3

     10^-9 =  1000 0011 = -3

你可能感兴趣的:(原码 反码 补码 位运算符)