c语言位运算负数的实例_负数位运算的右移操作-C语言基础

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一篇探讨的是“负数位运算的右移操作”,涉及到数据的源码、反码、补码的转换操作。属于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。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值