天天看点

为什么算术左移和逻辑左移一样

(1)负数的逻辑左移,明显符号位被移走了,1变成0了呀,负数不就变成正数了吗?为何能和算术左移一样呢?

为了解答这个问题,需要了解在计算机中所有的符号数都是按照补码存储的,最高位为符号位(0:整数 1:负数),所谓的补码:原码取反+1 构成

例如:8符号整形 -1 的补码 (源码)1000 0001  (补码)1111 1111

                            -64 的补码  (源码)1100 0000    (补码)1100 0000

                         -127 的补码  (源码)1111 1111    (补码)1000 0001

其实左移一位相当于数乘以2之后的结果,现在假设有符号数占8位,表示负数范围为 -1 ~ -128,如果当前被左移数是(-1~-64),在乘以2之后都是处于合法范围,而处于这个范围的数字的补码的第二位都是1,因此不需要考虑算术右移的符号位

c++

继续阅读