以前在学习C语言时一直没有彻底的明白unsigned int 与int的区别,当时好像有一个概念就是负数用补码来表示,而相应的补码是通过把原码取反后加1得到补码,在其中符号位是不变的。今天到一本书上说,对于无符号数据来说,右移是逻辑的,也就是说在高位上是补0的,这个是肯定的,道理很明显;而对于有符号的数据,其右移为 算术的逻辑的都是可以的,不过基本上所有的编译器与机器组合对于有符号数据都使用算术右移,也就是说高位补符号位。验证如下:
在这里取十进制数34来做为例子,在这里我才想起来从原码到补码的算法,一开始还把符号位都变了,真是基础知道不扎实啊。
34转换成十六进制就是0X22,二进制为00100010,
对于-34来说,对应的为二进制原码为:1000 0000 0000 0000 0000 0000 0010 0010,其反码为:1111 1111 1111 1111 1111 1111 1101 1101,通过加1得到补码,在机器中负数是通过补码来表示的:1111 1111 1111 1111 1111 1111 1101 1110,十六进制为0xffffffde;
接下来我把其右移3位,按理论上来说结果应该是:1111 1111 1111 1111 1111 1111 1111 1011,即0XFFFFFFFB。<