【问题标题】:Can someone explain the behavior of my right-shift in C?有人可以解释我在 C 中右移的行为吗?
【发布时间】:2019-02-10 18:06:31
【问题描述】:

我不明白以下代码的结果:

unsigned char p = 170;
p = (~p) >> 4 & 255;

结果是:245,我不明白为什么。

首先 (~p) 将应用 10101010 到 01010101 的原因

这是一个正数,所以 >> 4 在我的理解中会导致 00000101。

但它似乎是 11110101,我不明白为什么。据我了解,将正数向右移动将插入 0 而不是 1。

【问题讨论】:

  • @WaqasShabbir 未签名 ;-)

标签: c shift


【解决方案1】:

在表达式中使用时,比int 窄的整数通常转换为int。因此,使用 16 位 int 进行说明,在 (~p) >> 4 & 255

  • p 是 101010102
  • 这被转换为int,产生00000000101010102
  • ~p 产生 11111111010101012
  • (~p) >> 4 可能会产生 11111111111101012。 (负值的右移由实现定义。)
  • (~p) >> 4 & 255 产生 111101012
  • 111101012 是 245。

【讨论】:

  • 谢谢!这是有道理的,我完全忘记了转换!
猜你喜欢
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2022-11-03
  • 2020-06-03
相关资源
最近更新 更多