对于LittleEndian字节序的主机,在执行完Bfunc函数后全局变量a的值是( )
_UL a = 0xffffffff;
_UC Afunc( )
{
return 0x12345678;
}
_UL Bfunc( )
{
a = (_UL)Afunc ( );
}
A 0x12 B 0x78
C 0x12345678 D 0xffffff78
选B
Afunc返回_UC,会发生截断,无论是大端还是小端当发生截断的时候都只会把最低位的值赋值给新变量。这里是从int截断为char,因此最终将最低位的0x78赋值给a。
——————————————————
小端环境下:
typedef struct TestData_ {
unsigned int data1 : 2;
unsigned int data2 : 12;
unsigned int data3 : 2
} TestData;
int main(void)
{
TestData data;
memset(&data, 0, sizeof(data));
data.data1 = 0x7;
data.data2 = 0x10;
data.data3 = 0x1;
unsigned int result = *(unsigned int *)&data;
printf("value = 0x%.8x", result);
return 0;
}
输出结果为:0x4043
这道题目是位域与大小端的结合。根据结构体的定义,数据存储格式位(内存地址从低到高,即bit0对应的是低地址,bit31对应高地址):
由于是小端结构,因此低地址存放的是地位的数值,result为int型的,共4个字节,最高BYTE为bit31~bit24 =0,次高BYTE为bit23~bit16 = 0,之后的BYTE为bit15~bit8 =b01000000=0x40 ,最低BYTE =b01000011 =0x43
最后的结果则是0x4043