c语言中,有符号数位移

#include <stdio.h>

int main(void)
{
    unsigned i = 0xcffffff3;

    long j=0xcffffff3;

    int k=0xcffffff3;

    printf("num:\t%x\n",0xcffffff3 >> 2);

    printf("i:\t%x\n",i >> 2);

    printf("j:\t%x\n",j >> 2);

    printf("k:\t%x\n",k >> 2);
}

打印结果

sh-3.2# ./a.out
num:    33fffffc
i:    33fffffc
j:    33fffffc
k:    f3fffffc

无符号的0xcffffff3 转换成二进制为 1100 1111 1111 1111 1111 1111 1111   0011

右移两位后为  0011 0011 1111 1111 1111 1111 1111 1100  转换成16进制为 0x33fffffc

如果是有符号

1100 1111 1111 1111 1111 1111 1111   0011  右移后为 1111 0011 1111 1111 1111 1111 1111 1100

转换成16进制:  0xf3fffffc

也就是有符号的不管右移多少位,并不是最高位补1,而是每次右移时最高位都补1

转载于:https://www.cnblogs.com/xuxiang/p/6415410.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值