Warm tip: This article is reproduced from stackoverflow.com, please click
bit bit-manipulation c

small bitoperation problem with unsigned int in combination with unsigned char

发布于 2020-05-08 02:05:31

Hi I got a small conceptual problem regarding bitoperations. See the below code where I have a 4byte unsigned int. Then I access the individual bytes by assigning the address's to unsigned chars.

I then set the value of the last byte to one. And perform a shift right on the unsigned int(the 4byte variable). I do not understand why this operation apparantly changes the content of the 3byte.

See code below along with the output when I run it

#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

Thanks in advance

Questioner
monkeyking
Viewed
19
dbush 2020-02-22 06:56

If we change the output of the int to hex (i.e. change %u to %x), what happens becomes more apparent:

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

The value of val is shifted right by 1. This results in the low bit of the highest order byte getting shifted into the high bit of the next byte.