作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我遇到了一个关于位运算的小概念问题。请参阅下面的代码,其中我有一个 4 字节的无符号整数。然后我通过将地址分配给无符号字符来访问各个字节。
然后我将最后一个字节的值设置为 1。并对 unsigned int(4 字节变量)执行右移。我不明白为什么这个操作明显改变了 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
提前致谢
最佳答案
您发现您的计算机并不总是按照您碰巧期望的顺序存储多字节数据类型的字节。 valc[0]
是您系统上的最低有效字节 (LSB)。由于 LSB 存储在最低内存地址,因此称为“小端”系统。在另一端,valc[3]
是最高有效字节 (MSB)。
如果您改为打印 valc[3],valc[2],valc[1],valc[0]
,您的输出将更有意义,因为人类期望最重要的值在左边。
其他计算机架构是“big-endian”,将首先存储最高有效字节。
本文还更详细地解释了这个概念: https://en.wikipedia.org/wiki/Endianness
Brian Kernighan 和 Rob Pike 合着的“编程实践”一书也很好地介绍了字节顺序(第 8.6 节字节顺序)以及如何编写可在大端和小端系统上运行的可移植程序。
关于c - unsigned int 结合 unsigned char 的小位操作问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60347209/
我是一名优秀的程序员,十分优秀!