【发布时间】:2020-02-21 22:51:20
【问题描述】:
您好,我遇到了一个关于位操作的小概念问题。 请参阅下面的代码,其中我有一个 4 字节的无符号整数。然后我通过将地址分配给无符号字符来访问各个字节。
然后我将最后一个字节的值设置为 1。并对无符号整数(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
提前致谢
【问题讨论】:
-
您的第一个线索将是对第一个数字出现为“16777216”的原因进行自夸。然后尝试将其他三个字节设置为
1,一次一个,看看结果如何,你应该可以自己找出原因。 -
请注意,correct format specifier for
size_t(这是sizeof()返回的内容)是"%zu",而不是"%lu"。使用不正确的格式说明符会调用未定义的行为。
标签: c bit-manipulation bit