1 .我们知道结构中元素的地址通常包含许多元素,结构的大小是所有元素大小的总和(包括字节对齐)。
那么,在结构中,不同元素之间地址的相对位置是什么关系呢?
您之前定义的元素地址是位于低地址,还是之后定义的元素地址位于低地址?
用代码测试一下吧。 (我的计算机型号为R9000P、AMD处理器、x86体系结构、windows10操作系统、DevC ) )。
# include stdio.htypedefstruct { inta; int b; (}Test; Test test1; int main () {Test test2; printf(test1的a地址为%d,b地址为%dn )、test1.a、test1.b ); 打印(test 2的a地址为%d,b地址为%dn )、test2.a、test2.b ); 返回0; }运行结构如下图所示
我们一起测试了全局变量和局部变量的情况。
test1存储在全局变量(存储在堆中)中,test2存储在局部变量(存储在堆栈中)中。
所有这些都表明,先定义的元素位于低地址,后定义的元素位于高地址。
2 .大小侧概念(字节大小侧,比特大小侧)例)字节大小侧)内存地址0 x 000040010 x 00040020 x 00040030 x 120 x 340 x 560 x 78大端处理器)此数字在短语处理器:的情况下,该数字为0x78563412; 请用代码测试本机的字节大小侧
# include stdio.htypedefunion { inta; char b[4]; (}Test; int main () {Test test1; test1.a=1; printf(b数组中第四个元素的值为%d ),test1.b[0]; 返回0; }运行结果如下图所示
对于数组,低索引元素位于低地址,正如数组b的第一个元素为1所示,测试计算机是字节的小字节序。
关于二进制数10011101B
存储器内的位置为(LSB ) 10111001 ) msb )时,采用小端序模式; 内存中的位置为(MSB ) 1001101 (LSB )时,进入大端模式。 请继续在代码中测试位的大小侧:
# include stdio.htypedefunion { inta; struct {unsigned int d1:1; unsigned int d:30; unsigned int d2:1; (}bitField; (}Test; int main () {Test test1; test1.a=1; printf(bitfield的值d1为%dn ),test1.bitField.d1 ); printf(bitfield的值d2为%d ),test1.bitField.d2 ); 返回0; }运行结果如下图所示。
运行结果表明,该系统位的大小端为小端序模式,而d1表示最低级别的LSB。
再看一段代码
# include ' stdio.h ' struct kk { unsigned a :2; unsigned b:3; unsigned c:2; unsigned d:1; (kt; int main () { char result=3; memcpy(kt,result,1 ); printf(a=%d,b=%d,c=%d,d=%d,ok/n ),kt.a,kt.b,kt.c,kt.d ); 返回1; 在sun unix上用cc编译时,为0,0,1,1
用2000用VC6.0编译,结果为3,0,0,0
在c语言的位域中,每个字段都严格按照从bit地址的低位到高位的顺序排列。
=====================
-低- -高-
a b c d
=====================
接下来,我们来看看如何解析这个字节。
在little-endian计算机上,result字节中每个位的存储数组如下所示
=====================
-低- -高-
11000000
=====================
支持4个位区域
a=3
b=0
c=0
d=0
在big-endian机器中,结果字节内的各位的存储排列如下
=====================
-低- -高-
00000011
=====================
支持4个位区域
a=0
b=0
c=1
d=1
总结:使用C语言域类型时,各字段的排列顺序为从低位到高位的位顺序。
通过分离数据的存储和分析,可以很容易地说明字节序问题。