有人可以解释我在 C 中右移的行为吗?

标签 c shift

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

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/

相关文章:

ios - 修剪 UIImage 边框

c - 使用 O(1) find-max/find-min 实现堆栈时出错?

c - 使用动态数组的段错误

c - 在 C 中,将 (char) 0xFF 左移 8 位并将其转换为 int

html - 一些html+css代码让所有页面都移位

haskell - 一般而言,可折叠仿函数是否有相当于头/尾的东西?

java - 如何在 java 中移动 char 数组的值?

c - 将数组传递给函数以进行内存分配

c - 如何更改作为参数传递的变量的值?

c++ - 在 C++03 中左移有符号整数未定义行为吗?