gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:32:07 28 4
gpt4 key购买 nike

您好,我遇到了一个关于位运算的小概念问题。请参阅下面的代码,其中我有一个 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com