我是靠谱客的博主 呆萌煎蛋,最近开发中收集的这篇文章主要介绍C语言中移位操作符那点事,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近碰到几个有意思的移位操作符的题目,下面先来看看这几个题目(32bit-CPU架构):

1.     int i = 1;

        printf("%dn",i<<32);

2.     printf("%dn",1<<32);

3.     int i=-1;

        printf("%d,%dn",i<<32,  i<<31, i>>32, i>>31);

这几个题目看起来都很简单,但很容易中招哦,不信自己先给个答案,再来验证下吧!

第一题:

      和编译器的处理有关,正整数1在计算机中按照补码存储形式为0x 00 00 00 01,编译器默认将移位操作符的右边数对32取余,因此左移32位等同于左移0位,答案仍为1,对于右移也适用。

第二题:

      这个常数的移动操作编译器的处理略有不同,如果按照第一题来解,答案应该为1,可是编译后执行发现结果却为0,说明这里的1<<32编译器并没有对32取余,左移补0,因此,左移32位后则为0,这里再通过 printf("%dn",1<<33); 验证,发现结果仍为0,说明33并没有对32取余(如果取余的话结果应该为1<<1=2)。

第三题:

      有符号负整数-1,在内存中补码形式存储为0xFFFFFFFF,因为有符号位1的存在,变量的右移都补1,而左移仍补0,变量的左右移右操作数会对32取余,则左移32位和右移32位均等同于不移动,结果仍为-1,而左移31位补零,补码0xFFFFFFFF左移31位为0x80000000,可以自己手动还原为原码检验,打印到屏幕上为-2147483648,而右移31位,补码0xFFFFFFFF右移补1,因此右移任何位都不变,仍为-1。


总结:1. 编译器对常数的左右移位操作与变量略有不同,常数左右移位不会将右操作数对32取余,而变量的左右移会将右操作数对32取余。

            2.左移均补0,有符号数的负数的右移补1,正数的右移补0。

最后

以上就是呆萌煎蛋为你收集整理的C语言中移位操作符那点事的全部内容,希望文章能够帮你解决C语言中移位操作符那点事所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部