首页 > 解决方案 > 奇怪的右位移不一致

问题描述

我一直在使用 C 中的位(在 ubuntu 上运行)。在使用两种不同的方法来右移一个整数时,我得到了奇怪的不同输出:

#include <stdio.h>
int main(){
int x = 0xfffffffe;
int a = x >> 16;
int b = 0xfffffffe >> 16;
printf("%X\n%X\n", a, b);
return 0;
}

我认为每个输出都是相同的:FFFF,因为正确的四个十六进制位置(16 位)被右移了。相反,输出是:

FFFFFFFF
FFFF

什么解释了这种行为?

标签: cubuntubit-manipulationbit-shift

解决方案


当你说:

int x = 0xfffffffe;

设置为 -2 因为这里可以容纳x的最大值是并且它在转换过程中环绕。当您对负数进行位移时,它会变得很奇怪int0x7FFFFFFF

如果您将这些值更改为unsigned int一切正常。

#include <stdio.h>
int main(){
  unsigned int x = 0xfffffffe;
  unsigned int a = x >> 16;
  unsigned int b = 0xfffffffe >> 16;
  printf("%X\n%X\n", a, b);
  return 0;
}

推荐阅读