C语言中数值的移位运算


在C语言中的数值可以实现移位运算,由于数值分为无符号(unsigned)和有符号(signed),这两种的数值运算方式不一样。

无符号数值的运算很简单,总结一句话就是移位和补零,而有符号数值的移位需要注意一下。

当数值是有符号的时候,如果是左移的话就是移位和补零,所以一个正数可以通过移位变成一个负数或者是零;但如果是右移的话,就不太一样。由于是有符号数,可能发生逻辑右移,也可能发生算术右移,这一点,C标准并没有明确地指定是使用逻辑右移还是算术右移。但大多数的机器都使用算术右移,就是移位和补零。但是请注意,这只是说大多数的机器是这样的,你敢保证自己不会碰到特殊情况吗? 

但是有一种情况需要注意:

就是当我们移位的时候,如果发生了高位丢失的情况,这是系统会尝试去扩充数值的长度,见下例:

#include <stdio.h>

int main(void)
{
        char a = -128;

        printf("%d \n",a<<1);

        return 0;
}


运行结果是-256,但是char型的数据默认是有符号的最小也就是-128,怎么会有-256呢?这就是系统发现a左移1位后可能发生高位丢失,所以自动扩长了数据,修改为如下:

#include <stdio.h>

int main(void)
{
        char a = -128;
        char b = a<<1;  

        printf("%d \n",b);

        return 0;
}


这是的运行结果就是0,这是因为当系统尝试扩长数值的时候,将结果赋值给了char型的b,发生了一次隐式的数值类型转换,导致b只得到了结果的低八位。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值