用一个short长度的位域结构体存储钱数。q代表10进制的千位,b百,s十,g个。
显然,这是个BCD码的应用。
struct X {
unsigned short q : 4;unsigned short b : 4;
unsigned short s : 4;
unsigned short g : 4;
};
计划是用每4个二进制位表示一个十进制位。最重大的m15~m11位就是千位。
//m15~m12 m11~m8 m7~m4 m3~m0// 千 百 十 个
void main() {
X x = { 0 };
short money = 0x1234;
memcpy(&x,&money,2);
}
最后得到的结果q=4,b=3, s=2, g=1,
在小端序的系统,最不重大的位m4~m0(小头),存在低地址(在前),最重大的m15~m11存放在高地址。
所以,内存中的存放为:
b0~b3 b4~b7 b8~b11 b12~b15
m0~m3 m4~m7 m8~m11 m12~m15
q b s g (而位域的定义,也是从低地址开始的(这一点,同数组一样:a[0]的地址比a[1]低))
4 3 2 1
解决的办法是:重新定义结构体
struct X {
unsigned short g: 4;unsigned short s : 4;
unsigned short b : 4;
unsigned short q : 4;
};
b0~b3 b4~b7 b8~b11 b12~b15
m0~m3 m4~m7 m8~m11 m12~m15
g s b q
4 3 2 1
1) 大小端序,在bit范围内,也是反的
例如:5 在大端序 是00000101 ; 在小端序 是10100000
2) 在语言层面,文字量是概念值,例如short a=0x05, 这是个概念值5,具体如何存储,由系统决定。
3)序列化是以字节为单位打散数据的,单字节在不同的系统之间传输,大小端的bit层级的转换是系统完成的。
但是多字节组合的对象,例如int等,需要用编程的手段做顺序调整。
1324

被折叠的 条评论
为什么被折叠?



