您的位置:首页 > 编程语言 > C语言/C++

C语言负数的移位运算

2012-05-01 20:59 309 查看
在c 中左移也就是所说的逻辑移位,右端补0,而右移是算数移位,左端补齐的是最高位的符号位。

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

用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去考虑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: