这一篇探讨的是“负数位运算的右移操作”,涉及到数据的源码、反码、补码的转换操作。属于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的个数由该数据的类型以及计算机操作系统的位数决定)。其最高位为0表示正数。
对于一个有符号数(既不加unsigned修饰的数据类型)来说,其最高位便是它的符号位。由于有符号数的最高位为符号位,这就使得char类型有符号数的取值范围为-128~+127而不是0~256。</

本文详细解释了C语言中负数进行位运算右移操作的过程,通过实例展示了正数和负数右移后的结果,并介绍了原码、反码和补码的概念。讨论了位移操作在不同场景下的应用,特别是在处理大量数据时,位移操作相对于乘除运算的效率优势。
最低0.47元/天 解锁文章
2251

被折叠的 条评论
为什么被折叠?



