嗨,我遇到了一个关于位操作的小概念问题。请参阅下面的代码,其中我有一个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
提前感谢
如果将int的输出更改为十六进制(即,将%u
更改为%x
,则发生的情况会更加明显:]]
右移1。这导致最高位字节的低位移入下一个字节的高位。uint: 1000000, uchars: 0 0 0 1 uint: 800000, uchars: 0 0 128 0
val
的值
您已经发现您的计算机并不总是按照您期望的顺序存储多字节数据类型的字节。 valc[0]
是系统上的最低有效字节(LSB)。由于LSB存储在最低的内存地址,因此被称为“小尾数”系统。在另一端,valc[3]
是最高有效字节(MSB)。