按位非运算符是~,作用是将每位二进制取反
十进制2的二进制表示为:
0000,0010
每位都取反:
1111,1101
这是内存中的保存形式。
我们读取的十进制是根据原码来读取,而在内存中,数值都是以二进制补码形式保存的。
正数的补码和原码一样,负数的原码转补码或者补码转原码的规则:
符号位不变,将剩余位取反,得到反码,在反码的基础上最后一位加一得到负数的补码。
1111,1101输出10进制的过程:
- 符号位不变,剩余位取反
1000,0010 - 最后一位加1
1000,0011 - 得的结果1000,0011就是-3的原码形式
对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变: 对于负数的右移:因为负数在内存中是以补码形式存在的,所有首先根据负数的原码求出负数的补码(符号位不变,其余位按照原码取反加1),然后保证符号位不变,其余位向右移动到X位,在移动的过程中,高位补1.等移位完成以后,然后保持符号位不变,其余按位取反加1,得到移位后所对应数的原码。即为所求。 举例1: -100带符号右移4位。 -100原码: 10000000 00000000 00000000 01100100 -100补码: 保证符号位不变,其余位置取反加1 11111111 11111111 11111111 10011100 右移4位 : 在高位补1 11111111 11111111 11111111 11111001 补码形式的移位完成后,结果不是移位后的结果,要根据补码写出原码才是我们所求的结果。其方法如下: 保留符号位,然后按位取反 10000000 00000000 00000000 00000110 然后加1,即为所求数的原码: 10000000 00000000 00000000 00000111 所有结果为:-7 举例2: -100无符号右移4位。 -100原码: 10000000 00000000 00000000 01100100 -100补码: 保证符号位不变,其余位置取反加1 11111111 11111111 11111111 10011100 无符号右移4位 : 在高位补0 00001111 11111111 11111111 11111001 即为所求:268435449 总结:正数的左移与右移,负数的无符号右移,就是相应的补码移位所得,在高位补0即可。 负数的右移,就是补码高位补1,然后按位取反加1即可。