一道C语言题目引发的讨论

首先看一道C语言题目:
#include<stdio.h>

struct testbit{
    unsigned char a:3;
    unsigned char b:2;
    unsigned char c:3;
};

int main()/* 小端模式 */
{
    struct testbit s;
    unsigned char *p = (char*)&s;

    *p = 0xac;

    fprintf(stdout,"s.a = %d,s.b = %d,s.c = %d\n",s.a,s.b,s.c);

    return 0;
}


首先,我们要明白,什么是大端和小端,关于大小端的定义这里不再赘述。这里需要我们注意的是:一个数字本身没有大小端之分,产生大小端的原因是因为存储方式的不同。

明白了上面这点,在看这道题目。由题目可以得出指针p所指向的内容是0xac( 二进制的1010 1100 ),又因为内存在分配一个结构体中的数据的时候是按照声明的顺序依次分配的,并且还是小端模式,那么

unsigned char a就对应着二进制1010 1100的后3位(100)——4 

unsigned char b就对应着二进制1010 1100的中间2位(01) ——1

unsigned char c就对应着二进制1010 1100的前3位(101) ——5

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值