精华内容
下载资源
问答
  • C语言负数移位运算

    千次阅读 2014-01-10 16:57:57
    在c 中左移也就是所说的逻辑移位,右端补0,而右移是算数移位,左端补齐的是最高位的符号位。 故负数左移,有可能变成正数,但负数右移,肯定还是负数。 用16进制的形式对数据进行赋值,这16进制的数代表的是...
    在c 中左移也就是所说的逻辑移位,右端补0,而右移是算数移位,左端补齐的是最高位的符号位。
    故负数左移,有可能变成正数,但负数右移,肯定还是负数。

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

    1. /********************************************************************** 
    2.  * Compiler: GCC 
    3.  * Last Update:  Tue 01 May 2012 07:31:44 PM CST 
    4.  ************************************************************************/  
    5. #include <stdio.h>  
    6.   
    7. int main(int argc, char **argv)  
    8. {     
    9.     int i = 0x8000000f; //这里的0x8000000f为int型数据的补码形式  
    10.     int j = i >> 3; //右移是算术移位,左端补齐的是符号位  
    11.     int k = i << 1; //左移是逻辑移位,右端补0  
    12.     printf("%d %x\n", i, i);   
    13.     printf("%d %x\n", j, j);   
    14.     printf("%d %x\n", k, k);   
    15.   
    16.     i = -9;  
    17.     printf("%d %x\n", i, i);   
    18.     i = 0xfffffff7;  
    19.     j = i >> 3;  
    20.     k = i << 1;  
    21.     printf("%d %x\n", i, i);   
    22.     printf("%d %x\n", j, j);   
    23.     printf("%d %x\n", k, k);   
    24.   
    25.   
    26.     return 0;  
    27. }  


    运行结果:

    -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去考虑。
    展开全文
  • (1)在c 中左移也就是所说的逻辑移位,右端补0; 而右移是算数移位,左端补齐的是最高位的符号位。 (2)故负数左移,有可能变成正数;但负数右移,肯定还是负数。用16进制的形式对数据进行赋值,这16进制的数...
    (转载)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

    说明:

     

    转载于:https://www.cnblogs.com/Robotke1/archive/2013/05/13/3074979.html

    展开全文
  • 注:算术左移可能会导致负数移位成整数,如 1011 1111 1111 1111 (-16385) 左移一位后,变为 0111 1111 1111 1110 (32766) 除了发生此种情况外,算术右移可实现:右移n位实现乘以2^(-n)的功能。 2. 右移 (1)算术...

    逻辑移位与算术移位

    符号位参与移位

    1. 左移

    逻辑左移和算术左移一致,都是高位移出,低位补0

    2. 右移

    (1)算术右移
    高位补符号位,低位移出
    (2)逻辑右移
    高位补0,低位移出

    注:算术左移可能会导致负数移位成正数,如
    1011 1111 1111 1111 (-16385)
    左移一位后,变为
    0111 1111 1111 1110 (32766)
    除了发生此种情况外,算术移位实现:

    1. 左移n位实现乘以2^(n)的功能
    2. 右移n位实现乘以2^(-n)的功能
    展开全文
  • C语言移位运算

    2020-04-05 17:22:47
    C语言: 对于左移,其右端自动补零 对于右移,正数左端补零,,负数左端补1 (也即是算数移位,,不同的编译器,也可能进行逻辑移位)

    C语言:

    对于左移,其右端自动补零

    对于右移,正数左端补零,,负数左端补1

    (也即是算数移位,,不同的编译器,也可能进行逻辑移位)

    展开全文
  • 根据上图运行结果,其他的算术移位和逻辑移位负数的右移之外都是没有影响的. (一般都发生在 负数) 逻辑右移:你往右边移位时,因为右边移出,左边要移进,此时左边进来的位用0 算术右移:你往右边移位时,因为...
  • C语言负数整形的除法和取余

    千次阅读 2019-07-10 09:32:45
    C语言整形的除法的结果需要取整,例如5 / 3 = 1。C语言中的取整方式是向零取整。 取整风格共有3种: 向零取整。即向坐标轴0的方向,取最近的整数。...关于除法,人们常常用向右移位的方式来快...
  • C语言字符移位过程

    千次阅读 2017-09-05 10:42:44
    若原变量是负数,则其结果必为-1。(前提是移位后还赋值给char型变量) 今天无意中发现一个问题,一个char型的数据经过左移8位后若直接赋值给一个short或者int类型的话会自动保存左移后的正常值,而赋值给char型的...
  • c语言中有两个移位操作符——左移位“>".它们可以将一个值向左移和向右移。在左移位中,值最左边的被丢弃,而右边多出来的几个空位由0补齐。而右移在操作符同样,只是方向不同。一下例子以左移位操作符讲解。 猜想...
  • 主要问题在于C语言里面的移位操作数为负数的时候,不清楚、 key.h  /*板上按键GPH2_0-GPH2_3 ,GPH3_0-GPH3_3 其中GPH2_0 标注back GPH2_1 标注home GPH2_2 标注menu*/ #ifndef _KEY_H_ #define _...
  • C语言输出负数补码

    万次阅读 2017-06-06 22:35:00
    C语言打印出负数补码 最近刚好复习到计组的定点数运算,想着以前写快速幂都是打印出正数的补码,从来没有打印过负数的补码,于是写了几行代码,加深对这方面的理解。要知道的知识 数值在计算机表示为补码表示,所以...
  • C语言负数扩充

    2015-11-25 17:15:28
    1,C语言移位操作 正数左移,右侧补充零。正数右移,左侧补充零。 负数左移,右侧补充零。负数右移,左侧补充符号位1。 2,C语言类型转换提权 正数unsigned shrot的0xABCD,转换为unsigned int型,结果是0x...
  • C语言移位知识小结

    2017-03-19 18:37:20
    关于C语言移位功能的知识小结如下:  1,进行2的n次方计算,使用移位效率会提升很多;  2,移位有时候会导致数据丢失,但有时候这正是我们要的功能;  3,右移位操作是不可移植的;  4,移位的操作符好是...
  • 但是对于移位,编译器并不像C语言的编译器一样,有符号数,移位对于负数最高位补1,正数补0。而是都补零。所以对于负数移位,如下 if(baseline1&lt;0)  baseline1 &lt;= -((-baseline1)&gt;&gt;...
  • 1.逻辑移位和算术移位差异 逻辑移位是无论左移还是右移,移出都用0来填补。 算术移位分为两种情况,针对无符号值,那么算术移位和逻辑移位是相同的;...2.移位位数为负数 比如:a>>-2...
  • 今天碰到了负数除法与右移的替代问题,借机研究一下C语言负数除法的问题。此处只讨论整数除2的幂次方的情况,并取-7~-5除以4为例,不讨论一般除法的移位优化。 负数右移 对于有符号整数,右移时按高位补符号...
  • C语言中的移位操作

    2009-11-13 11:20:00
    C语言中的移位操作,内容不多。不过有些地方你不注意,就疏忽了。 先做两个小题先。 (1)unsigned char x=3;x>1是多少?(2)char x=3;x>1是多少?(3)char x=-3;x>1是多少? 3写成二进制数是00000011;-3写成二进制...
  • 使用移位很容易把符号位变换了,而乘法不会。 比如a=0b1011 1110,就是-66。...a=0b0111 1100=124,负数变正数了,符号位被移走了。 而实际上a*2=-132。所以用移位代替乘法时一定要注意符号位 ...
  • C语言中数值的移位运算

    千次阅读 2013-11-27 18:48:57
    C语言中的数值可以实现移位运算,由于数值分为无符号(unsigned)和有符号(signed),这两种的数值运算方式不一样。 无符号数值的运算很简单,总结一句话就是移位和补零,而有符号数值的移位需要注意一下。 当...
  • c语言---移位问题

    2017-06-25 16:54:43
    在c 中左移也就是所说的逻辑移位,右端补0, 而右移是算数移位,左端补齐的是最高位的符号位。 故负数左移,有可能变成正数, 但负数右移,肯定还是负数。 void test() { int a = 10; printf("10 a>>3 %d\n...
  • = :按位与后赋值^= :按位异或后赋值|= :按位或后赋值(注,负数按补码形式参加按位或运算)~= : 取反后赋值 >>= :右移后赋值 例如: x = 8; //00000000 00000000 00000000 00001000 x >>= 2; //...
  • 位运算:最接近底层操作的运算。 ...正数的左移与右移,负数的无符号右移,就是相应的补码移位所得,在高位补0即可。 逻辑右移:针对无符号数,左边补0 算数右移:针对有符号数,左边补1 ...
  • 移位运算分为逻辑左移、逻辑右移、算术左移、...结果:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。2 算术右移(>>)计算规则:按二进制形式把所有...
  • 近期有个朋友在程序中使用了对16进制数做负数移位(编译器是gcc),本人最次产生好奇。所以研究了一些。 对一个数做负数位移位的操作是不规范的,可是是可行的。 详细样例: char tmp = 0x10; tmp = tmp <&...
  • C语言整形的除法的结果需要取整,例如5 / 3 = 1。C语言中的取整方式是向零取整。 取整风格共有3种: 向零取整。即向坐标轴0的方向,取最近的整数。...关于除法,人们常常用向右移位的方式来快速计算...

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

c语言负数移位

c语言 订阅