ch2
移位
左移
x 01100010
x<<3 00010000
x>>2 00011000
右移
x 10100010
x<<3 00010000
x>>2 00101000 逻辑右移:补0
x>>2 1101000 算数右移:补符号位
无符号数逻辑右移,有符号数算数右移
无符号数与有符号数的转换
类型转换
short v = -12345;
unsigned uv = (unsigned) v;
输出为: v=-12345 uv=53191
-12345补码为1100111111000111
53191补码为1100111111000111
大小比较
比较运算符表达式中有符号和无符号数混用时: 有符号数隐式转换为无符号数
$$ 0 == 0U $$
$$ -1<0 $$
$$ -1>0U $$
$$ 2147483647>-2147483648 $$
$$ 2147483647U<-2147483648 $$
$$ -1>-2 $$
$$ (unsigned)-1>-2 $$
扩展、截断
符号扩展
将符号位复制k次
e.g.
- 0110 -> 000110
- 1110 -> 111110
截断
直接截断多出的位,会导致:
- 无符号数:取模
- 有符号数:变成另一个数
e.g.
无符号数:
- 2 = 00010->0010 = 2
- -6 = 11010->1010 = -6
有符号数:
- 10 = 01010->1010 = -6
- -10 = 10110->0110 = 6
整数运算
数乘
w位*w位=2*w位(有符号数要做符号扩展)
丢弃w位:保留低w位
乘以2的幂
u << k == u * 2 ^ k
除以2的幂
无符号数和正数:
u >> k == u / 2 ^ k
负数:
(x + (1 << k) - 1) >> k

浙公网安备 33010602011771号