有人可以解释我在 C 中右移的行为吗?
Can someone explain the behavior of my right-shift in C?
我不明白以下代码的结果:
unsigned char p = 170;
p = (~p) >> 4 & 255;
结果是:245,我不明白为什么。
首先 (~p) 会将 10101010 应用到 01010101
这是一个正数,因此 >> 4 在我看来会导致 00000101。
但是好像是11110101,我不明白为什么。根据我的理解,将正数向右移动将插入 0 而不是 1。
在表达式中使用时,小于 int
的整数通常会转换为 int
。因此,使用 16 位 int
进行说明,在 (~p) >> 4 & 255
:
p
是 101010102.
- 这将转换为
int
,生成 00000000101010102.
~p
产生 11111111010101012.
(~p) >> 4
可能会产生 11111111111101012。 (负值的右移是实现定义的。)
(~p) >> 4 & 255
产生 111101012.
- 111101012 是 245.
我不明白以下代码的结果:
unsigned char p = 170;
p = (~p) >> 4 & 255;
结果是:245,我不明白为什么。
首先 (~p) 会将 10101010 应用到 01010101
这是一个正数,因此 >> 4 在我看来会导致 00000101。
但是好像是11110101,我不明白为什么。根据我的理解,将正数向右移动将插入 0 而不是 1。
在表达式中使用时,小于 int
的整数通常会转换为 int
。因此,使用 16 位 int
进行说明,在 (~p) >> 4 & 255
:
p
是 101010102.- 这将转换为
int
,生成 00000000101010102. ~p
产生 11111111010101012.(~p) >> 4
可能会产生 11111111111101012。 (负值的右移是实现定义的。)(~p) >> 4 & 255
产生 111101012.- 111101012 是 245.