温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c - small bitoperation problem with unsigned int in combination with unsigned char
bit bit-manipulation c

c - unsigned int与unsigned char结合使用的小位操作问题

发布于 2020-05-11 17:53:51

嗨,我有一个关于位操作的小概念问题。请参阅下面的代码,其中我有一个4byte的unsigned int。然后,我通过将地址分配给未签名的字符来访问各个字节。

然后,我将最后一个字节的值设置为1。然后对unsigned int(4byte变量)执行右移。我不明白为什么此操作会明显改变3byte的内容。

运行它时,请参见下面的代码以及输出

#include <cstdio>

int main(int argc,char **argv){
  fprintf(stderr,"sizeof(unsigned int): %lu sizeof(unsigned char):%lu\n",sizeof(unsigned int),sizeof(unsigned char));
  unsigned int val=0;
  unsigned char *valc =(unsigned char*) &val;
  valc[3] = 1;
  fprintf(stderr,"uint: %u, uchars: %u %u %u %u\n",val,valc[0],valc[1],valc[2],valc[3]);
  val = val >>1;
  fprintf(stderr,"uint: %u, uchars: %u %u %u %u\n",val,valc[0],valc[1],valc[2],valc[3]);
  return 0;
}


sizeof(unsigned int): 4 sizeof(unsigned char):1
uint: 16777216, uchars: 0 0 0 1
uint: 8388608, uchars: 0 0 128 0

提前致谢

查看更多

提问者
monkeyking
被浏览
9
dbush 2020-02-22 06:56

如果我们将int的输出更改为hex(即更改%u%x),则发生的情况更加明显:

uint: 1000000, uchars: 0 0 0 1
uint: 800000, uchars: 0 0 128 0

数值val按1右移这导致最高字节的低位得到转移到下一个字节的最高位。