C级上的显式类型转换

Sco*_*zon 2 c bit-shift type-conversion bitwise-operators

如果我的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);
Run Code Online (Sandbox Code Playgroud)

Buffer的每个索引都有什么?我不确定类型转换是如何在逐位的水平上工作的.它是否将最重要的字节或最低有效字节传输Odometer到每个Buffer索引中?

koc*_*ica 5

Buffer[3]存储

Buffer[3] = Odometer & 0xff;
Run Code Online (Sandbox Code Playgroud)

最后8位0xff00ff 00和0xff 之间的掩码


然后你向右移Odometer8位,这样你得到0x00ff00ff


Buffer[2]存储

Buffer[2] = Odometer & 0xff;
Run Code Online (Sandbox Code Playgroud)

最后8位0x00ff00 ff和0xff 之间的掩码


和面具之间

0xff & 0x00 == 0x00
Run Code Online (Sandbox Code Playgroud)

0xff & 0xff == 0xff
Run Code Online (Sandbox Code Playgroud)

这样的结果

Buffer[3] = 0x00;
Buffer[2] = 0xff;
Buffer[1] = 0x00;
Buffer[0] = 0xff;
Run Code Online (Sandbox Code Playgroud)

按位

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Run Code Online (Sandbox Code Playgroud)

所以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
Run Code Online (Sandbox Code Playgroud)

而0xff和0xff看起来像那样

|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
Run Code Online (Sandbox Code Playgroud)