unsigned int 结合 unsigned char 的小位操作问题
small bitoperation problem with unsigned int in combination with unsigned char
您好,我遇到了一个关于位运算的小概念问题。
请参阅下面的代码,其中我有一个 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
提前致谢
如果我们将 int 的输出更改为 hex(即将 %u
更改为 %x
),发生的情况将变得更加明显:
uint: 1000000, uchars: 0 0 0 1
uint: 800000, uchars: 0 0 128 0
val
的值右移1。这导致最高位字节的低位被移入下一个字节的高位.
您发现您的计算机并不总是按照您碰巧期望的顺序存储多字节数据类型的字节。 valc[0]
是您系统上的最低有效字节 (LSB)。由于 LSB 存储在最低内存地址,因此称为 "little-endian" 系统。在另一端,valc[3]
是最高有效字节 (MSB)。
如果您改为打印 valc[3],valc[2],valc[1],valc[0]
,您的输出对您来说会更有意义,因为人们希望最重要的值位于左侧。
其他计算机体系结构 "big-endian" 并且将首先存储最高有效字节。
本文还更详细地解释了这个概念:
https://en.wikipedia.org/wiki/Endianness
Brian Kernighan 和 Rob Pike 的书 "The Practice of Programming" 也很好地介绍了字节顺序(第 8.6 节字节顺序)以及如何编写可在大端和小端系统上运行的可移植程序.
您好,我遇到了一个关于位运算的小概念问题。 请参阅下面的代码,其中我有一个 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
提前致谢
如果我们将 int 的输出更改为 hex(即将 %u
更改为 %x
),发生的情况将变得更加明显:
uint: 1000000, uchars: 0 0 0 1
uint: 800000, uchars: 0 0 128 0
val
的值右移1。这导致最高位字节的低位被移入下一个字节的高位.
您发现您的计算机并不总是按照您碰巧期望的顺序存储多字节数据类型的字节。 valc[0]
是您系统上的最低有效字节 (LSB)。由于 LSB 存储在最低内存地址,因此称为 "little-endian" 系统。在另一端,valc[3]
是最高有效字节 (MSB)。
如果您改为打印 valc[3],valc[2],valc[1],valc[0]
,您的输出对您来说会更有意义,因为人们希望最重要的值位于左侧。
其他计算机体系结构 "big-endian" 并且将首先存储最高有效字节。
本文还更详细地解释了这个概念: https://en.wikipedia.org/wiki/Endianness
Brian Kernighan 和 Rob Pike 的书 "The Practice of Programming" 也很好地介绍了字节顺序(第 8.6 节字节顺序)以及如何编写可在大端和小端系统上运行的可移植程序.