1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c语言左移15位 关于c语言中左移右移运算符的问题

c语言左移15位 关于c语言中左移右移运算符的问题

时间:2022-11-29 21:51:09

相关推荐

c语言左移15位 关于c语言中左移右移运算符的问题

参照《c与指针》,在c语言中左移时,不论算术左移还是逻辑左移效果都是相同的。而且对于有符号和无符号类型执行相同的操作,即按照二进制位向左左移N位。例如:

1 clude

2 intmain()3 {4 int a = 0xafffffff;5 printf("%dn",a<<1);6 int b = 0xff;7 printf("%dn",b<<1);8 }

ubuntu@ubuntu:~/code/.8.28$ ./test31610612734

510

int型变量a在内存中转换为2进制储存 1010 1111 1111 1111 1111 1111 1111 1111为一个负整数,b在内存中储存为 0000 0000 0000 0000 0000 0000 1111 1111为一个正整数,程序结果如上。a左移后转化为正整数,b转换为正整数 ,都按2进制左移一位(包括符号位)。

而对于右移来讲,针对不同的编译器,可能会进行算术或逻辑移位。在gcc下进行算术移位,即对于正整数右移,算数移位与逻辑移位相同,右移后左端补0,对于负整数右移,算数移位为符号位1不动,右移后左端补1。

1 #include

2 intmain()3 {4 int a = 0xafffffff;5 printf("%dn",a<<1);6 int b = 0xff;7 printf("%dn",b<<1);8 }

ubuntu@ubuntu:~/code/.8.28$ ./test3-671088641

127

a作为负数 右移左端补1,b作为正数右移左端补0,验证了以上结论。

在左移右移中,如果数据类型总位数小于int,则先转化为int再进行移位运算。如果左移或右移位数大于数据类型位数,则先进行对数据类型位数取模,再用余数进行移位运算。

1 #include

2 intmain()3 {4 char a = 0x11;5 //for(i = 0;i < 100;i++)6 //{7 //printf("%dn", a>>i);8 //}

9 printf("%dn", a>>(sizeof(int)*8+3));10 printf("%dn", a>>3);11 printf("%lun", sizeof(a>>3));12 printf("%ldn",sizeof(a)) ;13 }

ubuntu@ubuntu:~/code/.8.27$ gcc -o test1 test1.c

test1.c: In function ‘main’:

test1.c:9:21: warning: right shift count >= width of type [-Wshift-count-overflow]

printf("%dn", a>>(sizeof(int)*8+3));^ubuntu@ubuntu:~/code/.8.27$ ./test12

2

4

1ubuntu@ubuntu:~/code/.8.27$

针对一个char型数据,当打印sizeof(a>>3)时输出为4,说明此时a>>3这个变量为int型。而上边对于a>>3与a>>(32+3)的输出结果相同,同时系统警告移位大于

数据类型宽度,证明了上文结论。

内容来源于网络如有侵权请私信删除

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。