Dan*_*Dan 2 c struct bit-manipulation unions
#include <stdio.h>
union bits_32{
unsigned int x;
struct {char b4,b3,b2,b1;} byte;
} ;
int main(int argc, char **argv){
union bits_32 foo;
foo.x=0x100000FA;
printf("%x",foo.byte.b4 & 0xFF);
}
Run Code Online (Sandbox Code Playgroud)
这将输出FA.为什么不输出10因为b4占据了第一个空间?
这取决于您的机器的endianess.如果你的机器是小端,它打印FA(你的小端是吗?).如果您的机器是大端,它打印10.
在内存中存储单词 我们已经将单词定义为32位.这与4个字节相同.整数,单精度浮点数和MIPS指令都是32位长.我们如何将这些值存储到内存中?毕竟,每个内存地址可以存储一个字节,而不是4个字节.
答案很简单.我们将32位数量分成4个字节.例如,假设我们有32位数量,写为90AB12CD16,十六进制.由于每个十六进制数字是4位,我们需要8个十六进制数字来表示32位值.
因此,4个字节是:90, AB, 12, CD其中每个字节需要2个十六进制数字.
事实证明,有两种方法可以将其存储在内存中. Big Endian 在big endian中,将最重要的字节存储在最小的地址中.这是它的样子:
Address Value
1000 90
1001 AB
1002 12
1003 CD
Run Code Online (Sandbox Code Playgroud)
Little Endian 在little endian中,将最低有效字节存储在最小地址中.这是它的样子:
Address Value
1000 CD
1001 12
1002 AB
1003 90
Run Code Online (Sandbox Code Playgroud)
请注意,与big endian相比,这是相反的顺序.要记住哪个是哪个,回想一下是先存储最低有效字节(因此,小端)还是先存储最高有效字节(因此,大端).
注意我在最低有效位中使用了"byte"而不是"bit".我有时将其视为LSB和MSB,其中'B'大写为引用字节并使用小写'b'来表示位.在字节序方面,我只提到最重要和最不重要的字节.
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |