• (转载)C语言负数的移位运算


    (转载)http://blog.csdn.net/e3399/article/details/7526230

    (1)在c 中左移也就是所说的逻辑移位,右端补0;

    而右移是算数移位,左端补齐的是最高位的符号位。

    (2)故负数左移,有可能变成正数;但负数右移,肯定还是负数。

    用16进制的形式对数据进行赋值,这16进制的数代表的是补码。
        i = 0xfffffff7; //0xfffffff7是补码,而不是原码,故i = -9
        printf("%d %x\n", i, i);
        i = -9;
        printf("%d %x\n", i, i);  //故两个printf输出结果相同

    /**********************************************************************
     * Compiler: GCC
     * Last Update:  Tue 01 May 2012 07:31:44 PM CST
     ************************************************************************/
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {   
        int i = 0x8000000f; //这里的0x8000000f为int型数据的补码形式
        int j = i >> 3; //右移是算术移位,左端补齐的是符号位
        int k = i << 1; //左移是逻辑移位,右端补0
        printf("%d %x\n", i, i); 
        printf("%d %x\n", j, j); 
        printf("%d %x\n", k, k); 
    
        i = -9;
        printf("%d %x\n", i, i); 
        i = 0xfffffff7;
        j = i >> 3;
        k = i << 1;
        printf("%d %x\n", i, i); 
        printf("%d %x\n", j, j); 
        printf("%d %x\n", k, k); 
    
    
        return 0;
    }

    运行结果:

    -2147483633 8000000f

    -268435455 f0000001
    30 1e
    -9 fffffff7
    -9 fffffff7
    -2 fffffffe
    -18 ffffffee


    -9的8位补码表示是1111 0111,即0xf7,这里是int型,扩展成32位表示是0xfffffff7。也可以直接用32位的形式写出-9的补码形式。
    对于signed类型的扩展,看该数据的最高位,为1,则扩展的所有位都为1,为0,则扩展的位都为0,故0xf7扩展成32位是0xfffffff7。
    这里 -9 << 1 = -18。不能简单的从左移就相当于乘以2来理解,要从-9的补码是0xfffffff7f去考虑。


    #include <stdio.h>
    
    int main(int argc, char** argv)
    {
        char ch = 0x81;
    
        ch = ch >> 1;
        printf("%d\n", ch); // -64
    
        ch = 0x81;
        ch = ch >> 2;
        printf("%d\n", ch); // -32
    
        ch = 0x81;
        ch = ch >> 3;
        printf("%d\n", ch); // -16
    
        return 0;
    }

    程序输出:

    -64
    -32
    -16

    说明:

  • 相关阅读:
    AGC002
    ICPC 北美Mid Central 2019 Regional
    【洛谷 5020】货币系统
    【洛谷 1109】学生分组
    【洛谷 2915】奶牛混合起来
    【洛谷 4162】最长距离
    【YCOJ 3805】竞选
    【洛谷 2807】最长路
    【洛谷 2918】买干草Buying Hay
    【LOJ 10172】涂抹果酱
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3074979.html
Copyright © 2020-2023  润新知