高级农民
- 积分
- 1525
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-12-2
- 最后登录
- 1970-1-1
|
我不是做底层的,如果有大佬路过还希望轻喷。
-
以下假设当前的计算机是8 bit的,也就是一个整数在计算机里用8个bit(0或1)表示.
我们先说负数是怎样表示的。目前主流平台都采用2's complement作为负数的表示方法,其中complement是补码(即对于全部bit取反)的意思。
也就是对于任意一个整数a,对于其相反数b(也就是数学意义上的 a = -b),2's complement保证a和b的二进制表示值相加等于2的8次方(256)。
举一个例子:
整数5用8个bit来表示就是0000 0101,那么根据上面的定义,整数-5的二进制表示值和0000 0101相加应该会得到1 0000 0000.
如果我们把0000 0101取按位非(not),会得到1111 1010.
我们再把1111 1010加一个1,会得到1111 1011.
把0000 0101和1111 1011相加一下会得到1 0000 0000,也就是上面我们说的那个数。
据此,1111 1011定义为-5的二进制表示,所有大于0的自然数通过取not加1都可以得到它的相反数的二进制表达。
8位bit表示的数字范围是-128到127,因为2的 (8-1) 次方等于128,最高位要作为符号位(0表示正数,1表示负数)。
有符号右移会保留这个数的正负。例如1111 1011(-5),有符号右移会得到1111 1101(-3),最右侧少了个1,最左侧补了个1. 因为保留正负,所以也叫arithmetic operation. 可以用来快速计算除以2的结果。
无符号右移不保留这个数的正负。例如1111 1011(-5),无符号右移会得到0111 1101(125),最右侧少了个1,最左侧补了个0. |
|