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

【C语言/C++】算术移位和逻辑移位以及一道移位的题目

2016-11-22 15:44 309 查看

算术移位和逻辑移位

基本概念

逻辑移位:移位所缺少的数字用“0”来填充

算术移位:移位所缺少的数字用符号位来填充

C/C++中的移位

在C/C++中,整数分为有符号整数和无符号整数两种

- 1 - 对于无符号数,采用逻辑移位,不论左移右移都用“0”填充;

- 2 - 对于有符号数,分左移和右移两种情况

- 2a - 若为左移,则属于逻辑运算,补“0”

- 2b - 若为右移,则属于算术运算,补“符号位”

看一道有关位移的面试题

int main()
{
int a = 1;
int b = 32;
printf("%d %d\n", a << b, 1 << 32);
return 0;
}

大家先猜想一下,然后再看下面的结果

运行结果



通过结果,我们发现常量和变量的移位是有区别的

我们需要知道

对于常量,由于左移的位数大于了31位,所以结果为0

而对于变量,如果移位的位数 b 大于了该类型的大小 sz ,则先用b对sz取模,即 b = b % sz,然后再进行移位运算

验证变量移位

我们定一个变量为-1,然后通过循环,使其分别左移1~33位

int main()
{
int a = -1;
int b = 0;
for (int i = b; i <= 33; ++i)
printf("%d左移%.2d位 : 左移结果-> %11d\n", a , i, a << i);

return 0;
}

运行结果



常量移位这里就不验证了,只要移位超过31,就是0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  移位 const