C中位级别的显式类型转换

C中位级别的显式类型转换,c,type-conversion,bitwise-operators,bit-shift,C,Type Conversion,Bitwise Operators,Bit Shift,如果我的c代码是: unsigned char Buffer[4] = { 0, 0, 0, 0}; unsigned long Odometer = 0xff00ff00; Buffer[3] = Odometer & 0xff; Odometer = Odometer >> 8; Buffer[2] = (unsigned char)(Odometer & 0xff); Odometer = Odometer >> 8; Buffer[1] =

如果我的c代码是:

unsigned char Buffer[4] = { 0, 0, 0, 0}; 
unsigned long Odometer = 0xff00ff00;

Buffer[3] = Odometer & 0xff;

Odometer = Odometer >> 8;
Buffer[2] = (unsigned char)(Odometer & 0xff);

Odometer = Odometer >> 8;
Buffer[1] = (unsigned char)(Odometer & 0xff);

Odometer = Odometer >> 8;
Buffer[0] = (unsigned char)(Odometer & 0xff);

缓冲区的每个索引中都有什么?我不知道如何类型铸造将工作在一点明智的水平。它是否将最高有效字节或最低有效字节从
里程表
传输到每个
缓冲区
索引?

存储到
缓冲区[3]

Buffer[3] = Odometer & 0xff;
Buffer[2] = Odometer & 0xff;
最后8位0xff00ff00和0xff之间的掩码


然后将
里程表
8位右移,得到0x00ff00ff


存储到
缓冲区[2]

Buffer[3] = Odometer & 0xff;
Buffer[2] = Odometer & 0xff;
最后8位0x00ff00ff和0xff之间的掩码


和之间的掩码

0xff & 0x00 == 0x00

0xff & 0xff == 0xff
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
因此,结果是

Buffer[3] = 0x00;
Buffer[2] = 0xff;
Buffer[1] = 0x00;
Buffer[0] = 0xff;

按位

0xff & 0xff == 0xff
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
所以0x00&0xff看起来是这样的

|0|0|0|0|0|0|0|0|
|1|1|1|1|1|1|1|1|
-----------------
|0|0|0|0|0|0|0|0| <-- res
|1|1|1|1|1|1|1|1|
|1|1|1|1|1|1|1|1|
-----------------
|1|1|1|1|1|1|1|1| <-- res
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0|
|1|1|1|1|1|1|1|1|
-----------------

|0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
缓冲区[3]
包含里程计
的最低有效字节和
缓冲区[0]
的最高有效字节。@眠りネロク 取决于endianes我的朋友:)此代码与endianess无关,因此缓冲区将包含[0]=MS字节。。。[3] =LS字节,就这么简单。你有
30年的有效期吗?通过
SHR
进行换档空格总是用零填充,所以你可以把它记下来,投回原票:-)@PeterJ@PeterJ删除评论,但不要在自己犯错后否决?做占位符?我认为编程超过30年的人不应该做这些事情。