这一篇探讨的是“负数位运算的右移操作”,涉及到数据的源码、反码、补码的转换操作。属于C语言基础篇。
先看例子
#include
int main(void) {
//正数的位右移
//补码0000 0101
int x = +5;
//正数补码右移两位后
//补码0000 0001
printf("+5>>2 = %d\n", x>>2); //+5>>2 = 1
//负数的位右移
//补码1111 1011
int y = -5;
//负数补码右移两位后
//补码1111 1110
printf("-5>>2 = %d\n", y>>2); //-5>>2 = -2
}
输出结果。
好了,现在来解释一下这个输出结果是怎么来的。
在讨论负数的右移之前,我们先要了解一下什么是原码、什么是反码、什么是补码。
任何一个数据都有其唯一对应的原码、反码以及补码。计算机对于数据的处理都是以补码形式来进行的(至于为什么要这样就又可以展开一整篇文章来说明了,这里就不深入讨论了)。而且正数和负数的原反补码的转换规则是不一样的。
对于正数来说,其原、反、补码都是相同的,都是该数据的二进制形式。例如+5的原、反补码均为0000……0101(其中0的个数由该数据的类型以及计算机操作系统的位