从数组循环移位那篇文章想到了移位的问题,想弄明白,于是乎产生了一下的联系:
1、逻辑移位和算数移位的区别?
2、在C语言中的移位运算符》和《是逻辑的还是算数的?
3、在不同的编译器下,存在差异吗?
4、如果存储的是一个二进制的数,例如0x11000,那么计算机是识别为正数12呢,还是负数-4呢?然后进行移位运算会得到什么结果呢?
第一个问题简略答案:
1)算术移位 当乘数或除数是2n时,算术移位用来快速地完成对整数进行乘法或除法的运算。算数左移n位相当于乘上2n,执行方法是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补0。
2)逻辑移位 逻辑左移n位的执行方法,是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补"0"。 逻辑右移n位的执行方法是把原来数中的每一位都向右移动n个位置,右面移出的低位丢弃不要,左面高位空出的位置上全部补0。
2)逻辑移位 逻辑左移n位的执行方法,是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补"0"。 逻辑右移n位的执行方法是把原来数中的每一位都向右移动n个位置,右面移出的低位丢弃不要,左面高位空出的位置上全部补0。
逻辑左移和算术左移无区别,统一功能的两种写法(相当于无符号数乘2)
右移有区别:算术右移最高位无变化(相当于有符号数除2)逻辑右移最高位 不管是什么都用0填充 (相当于无符号数除2)
第二个问题:
在C语言中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变。
第三个问题:
我现在还不知道正确答案
第四个问题:
在C语言中,按照二进制的方式存储int型整数,一共是32位,如果没有写满32位,前面的自动填充为0,则为正数,否则如0x80000000,则为负数,而如0x11000则为整数,进行左移运算没有任何差别,对于右移运算进行的是算数右移。