原码、反码以及补码都是有符号的,其中最高位存放符号位,0 表示正数,1 则 表示负数。
对于正数来说 : 原码=反码=补码,而负数我们需要计算。
源码:最高位表示正负,其余位表示数值。例如十进制的正负 1,用 8 位二进制 的原码表示:
+1 = [0000 0001]原
-1 = [1000 0001]原
反码:正数的反码和原码相同;负数的反码是在原码的基础上,符号位不变, 其余位按位取反。
+1 = [0000 0001]反
-1 = [1111 1110]反
以下是一些关于原码、反码和补码的基本知识:
- 原码:正数的原码就是其本身,负数的原码为其对应正数的补码按位取反。
- 反码:正数的反码就是其本身,负数的反码为其对应正数的原码按位取反加1。
- 补码:正数的补码就是其本身,负数的补码为其对应正数的反码按位取反加1
+1 = [0000 0001]补
-1 = [1111 1111]补
为什么用补码存储整数数据?
我们人脑可以知道最高位是符号位,在计算的时候就会根据符号位进行加减, 但是对于计算机,加减乘除已经是最基础的运算,因此要设计得尽量简单,而 让计算机辨别符号位会让计算机的基础电路设计变得复杂。于是人们开始探索 将符号位参与运算,并只保留加法的方法,根据运算法则,减去一个数等于加 上这个数的负数,即 1 - 1 = 1 + (-1)
使用原码运算
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2
使用原码计算 1 - 1 的结果是 -2 。所以让符号位也参与运算时,使用原码,对 于减法运算来说,结果是不正确的。这也是计算机内存在存储数据时不使用原 码的原因。为了解决这一问题,就出现了反码。
使用反码运算
1 - 1 = 1 + (-1) = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 000]原 = -0
使用反码的问题在于 0 的符号是负号,而且 [0000 0000]原 和 [1000 0000]原 都表示 0。为了解决这一问题,就出现了补码。
使用补码运算
1 - 1 = 1 + (-1) = [0000 0001]补 + [1111 1111]补 = 1(舍去) [0000 0000]反 = [0000 0000]原 = 0
这样就不存在 -0 的问题了。
现在,你该知道为什么用补码存储整数数据了吧
一、正数
二、负数
-
负数的反码是将其原码中,除符号位以外,每一位取反。例如,对于一个8位二进制数,如果它的最高位为1,则它是负数。除了第一位外
-
负数的补码是在其反码的基础上加1得到的
三、计算 -5&6
四、左移
公式:m<<n = m*(2^n)
- 计算6<<2的结果
- 将6转换为32为二进制
- 把二进制左移两位,空出位补0
- 然后转换为十进制就是24
五、右移
公式:m>>n = m/(2^n)
- 计算12>>2的结果
- 将12转换为32位二进制
- 二进制右移空出的高位补上最高位的数字
- 转换为十进制就是3