位运算分为左移(<<)和右移(>>),其中右移运算又分为无符号右移和有符号右移。 左移运算(<<) 左移运算就是将一个数的所有二进制位向左移动若干位,移动的位数由右操作数指定。右操作数必须是非负值,左边空出的位用0填补,高位左移,溢出则舍弃该高位。例如: 3 << 2 的计算过程: 3的原码(0000 0011) ...
因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移、右移都是使用的逻辑左移和逻辑右移)。 而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!(算术右移和逻辑右移的区别是:算术右移不右移符号位,即最高位,右移后前补0还是1取决于符号位的...
右移运算符和左移运算符大致一样,唯一区别就是方向不同,另外对于有符号整型数右移,左边是补符号位;而对于无符号整型数右移,左边补0。在这里我们只分析有符号的负整型数。 假设我们有一个x值为-10,我们把其右移两位。 原码:10000000 00000000 00000000 00001010 反码:11111111 11111111 11111111 11110101 补码:1111...
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负 值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分 用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注 意:对无符号数,...
注意, 对于无符号整数,右移必须是逻辑右移。而对于有符号整数,C 语言标准并没有明确定义应该使用哪种类型的右移,但几乎所有的编译器均采用算术右移。 参考如下示例: 代码语言:javascript 复制 ///@file: main.c//#include<stdio.h>#include<stdint.h>intmain(){int a=-1;printf("a=0x%x\n",a);//a...
右移 num1 >> num2 :右移第一个操作数的位,第二个操作数决定要移动的位数 (x>>y)等价于 x 除以 2^y。 无符号整型x、非负有符号整型:整数部分 x 除以 2^y。 负数x:由实现定义,大多数情况下实现算术右移 右操作数为负数或大于左操作数bit位范围,结果未定义 ...
而整数又分为有符号整数和无符号整数这两种,而有符号数又分为正整数和负整数这两种。 正整数的原、反、补码都相同。 负整数的三种表方法各不相同。 负整数取反加一为补码 补码取反加一为原码。 我们来看一个简单的运算: #include<stdio.h> int main() ...
左移我们好说,主要是右移我们需要细讲一下: 明显看到,这是在无符号数下进行右移,第一个小伙伴都不会感到惊讶, 可是第二个就有点不理解了,我们来解释下: 这里有一个问题,当 -1 准备放入变量 b 的时候我们需要看-1的类型吗? 答案是不需要!内存中放的都是二进制补码,本质上是把 -1 的补码放入变量 b ...
>> 右移操作符<< 左移操作符 左移操作符移位规则 左边抛弃、右边补0 右移操作符移位规则 首先右移运算分两种: 1. 逻辑移位 左边用0填充,右边丢弃 2. 算术移位 左边用原该值的符号位填充,右边丢弃 注意: 对于移位运算符,不要移动负数位,这个是标准未定义的 ...