对一个程序的思考3(移位操作之移动负数位)

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

而右移是算数移位,左端补齐的是最高位的符号位。(有的编译器可能右移也是逻辑移位,但道理是一样的),这里以右移部符号位为准。

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

/********************************************************************** * yiwei.cpp *Compiler: GCC,VS,VC6.0 win32 *Author:WK * Last Update: Sun 29 March 2015 10:21:44 AM CST ************************************************************************/#include <stdio.h>int main(int argc, char **argv){int i = -9,j=9;printf("-9存储形式: %d %x\n", i, i);printf(" 9存储形式: %d %x\n", j, j);int i1 = i >> 3;int i2=i<<3;printf("-9右移3位: %d %x\n", i1, i1); printf("-9左移3位: %d %x\n", i2, i2);int j1=j >> 3; int j2=j<<3;printf(" 9右移3位: %d %x\n", j1, j1); printf(" 9左移3位: %d %x\n", j2, j2);int i3 = i >> 33;int i4=i<<33;printf("-9右移33位: %d %x\n", i3, i3); printf("-9左移33位: %d %x\n", i4, i4);int j3=j >> 33; int j4=j<<33;printf(" 9右移33位: %d %x\n", j3, j3); printf(" 9左移33位: %d %x\n", j4, j4);int i5 = i >> -3;int i6=i<<-3;printf("-9右移-3位: %d %x\n", i5, i5); printf("-9左移-3位: %d %x\n", i6, i6);int j5=j >> -3; int j6=j<<-3;printf(" 9右移-3位: %d %x\n", j5, j5); printf(" 9左移-3位: %d %x\n", j6, j6);int i7 = i >> -33;int i8=i<<-33;printf("-9右移-33位: %d %x\n", i7, i7); printf("-9左移-33位: %d %x\n", i8, i8);int j7=j >> -33; int j8=j<<-33;printf(" 9右移-33位: %d %x\n", j7, j7); printf(" 9左移-33位: %d %x\n", j8, j8);return 0;}运行结果是:

首先,我在这里给出的极端数字有在int 只有32位的情况下移动33位和-33,我没有给出移动3000位移动-3000位或个多,因为我认为这个移动33位和-33位已经足够代表这种情况,下来我们就分析一下结果的原因

我开始猜测编译器中右 i=n%32 程序会将大数字转化在32位平台的32位可移动范围内(我们这里的移动在int 所能表示的范围内)

于是进行了以下测试:

#include <stdio.h>int main(int argc, char **argv){int i = -9;printf("-9存储形式: %d %x\n", i, i); printf("\n\n");int i3 = i >> 33;int i4=i>>1;printf("-9右移33位: %d %x\n", i3, i3); printf("-9右移1 位: %d %x\n", i4, i4);printf("\n\n");int i5 = i >> -1;//-1的补码形式:11111111 111111111 11111111 11111111int i6=i>>63;//63二进制:00000000 00000000 00000000 00011111int i7=i>>31;printf("-9右移-1位: %d %x\n", i5, i5); printf("-9右移63位: %d %x\n", i6, i6);printf("-9右移31位: %d %x\n", i7, i7);printf("\n\n");int i8 = i >> -33;//-33补码存储:11111111 11111111 11111111 11011111int i9 = i >> -1;int i10= i >> 63;printf("-9右移-33位: %d %x\n", i9, i9); printf("-9左移-1 位: %d %x\n", i9, i9);printf("-9左移63 位: %d %x\n", i10, i10);return 0;}结果如下:

又进行了测试:

/********************************************************************** * yiwei.cpp *Compiler: GCC,VS,VC6.0 *Author:WK ************************************************************************/#include <stdio.h>int main(int argc, char **argv){int i = 9;printf("9存储形式: %d %x\n", i, i); printf("\n\n");int i3 = i >> 33;int i4=i>>1;printf("9右移33位: %d %x\n", i3, i3); printf("9右移1 位: %d %x\n", i4, i4);printf("\n\n");int i5 = i >> -1;//-1的补码形式:11111111 111111111 11111111 11111111int i6=i>>63;//63二进制:00000000 00000000 00000000 00011111int i7=i>>31;printf("9右移-1位: %d %x\n", i5, i5); printf("9右移63位: %d %x\n", i6, i6);printf("9右移31位: %d %x\n", i7, i7);printf("\n\n");int i8 = i >> -33;//-33补码存储:11111111 11111111 11111111 11011111int i9 = i >> -1;int i10= i >> 63;printf("9右移-33位: %d %x\n", i9, i9); printf("9左移-1 位: %d %x\n", i9, i9);printf("9左移63 位: %d %x\n", i10, i10);return 0;}

于是我进行了如下分析:

只有坚韧不拔向着目标奋进,成功后将在不远处等待着你的到来。

对一个程序的思考3(移位操作之移动负数位)

相关文章:

你感兴趣的文章:

标签云: