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

posted @ 2025-06-30 21:10  张诗羽  阅读(14)  评论(0)    收藏  举报