我不明白以下代码的结果:
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。
关于有人可以解释我在 C 中右移的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54619403/