C语言中如何将16位结构体定义为4位和12位两部分

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中如何将16位结构体定义为4位和12位两部分相关的知识,希望对你有一定的参考价值。

在C语言中,需要定义一个结构体NAME,此结构体为16位unsigned 类型,结构体分为两部分A和B,其中A为4位unsigned类型,B为12位unsigned类型,应该如何定义?

1、可以通过位域来实现,如下:
struct int_16

unsigned a : 4; //占4位的部分变量名为a
unsigned b : 12; //占12位的部分变量名为b
;
2、在c语言中定义bit型变量,可以使用位域来自定义。
位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:

struct 位域结构名
位域列表 ;
其中位域列表的形式为: 类型说明符 位域名:位域长度;

示例:通过位域来计算IEEE754浮点数标准中,单精度浮点数的最大值、最小值以及最小弱规范数。
#include <stdio.h>
typedef struct FP_SINGLE

unsigned __int32 fraction : 23;
unsigned __int32 exp : 8;
unsigned __int32 sign : 1;
fp_single;
int main()

float x;
fp_single * fp_s = (fp_single *)&x;
fp_s->sign = 0;
fp_s->exp = 0xfe;
fp_s->fraction = 0x7fffff;
printf ("float 最大数: %le\\n",(double)x);
fp_s->sign = 0;
fp_s->exp = 0x1;
fp_s->fraction = 0x0;
printf ("float 最小数: %le\\n",(double)x);
fp_s->sign = 0;
fp_s->exp = 0;
fp_s->fraction = 0x1;
printf ("float 最小弱规范数:%le\\n\\n",(double)x);
return 0;
参考技术A 没法定义,只是在使用的时候可以实现4位与12位的效果。可以将A与B分别定义成16位的,按两个成员来用。或定义成一个16位成员,然后在读、写时分别处理高四位与低12位。 参考技术B #include <stdio.h>

typedef struct

unsigned short A:4;
unsigned short B:12;
Name;

main()

printf("the lenth of UINT is:%d\n",sizeof(Name));


已调试通过~~~~
你问的那个问题和编译器有关

首先要在你的编译器中找到两字节的变量
VC中 unsigned short是两字节的
所以我定义的是 unsigned short

TC中可能用的是 unsigned int本回答被提问者采纳
参考技术C 是 位域 吧:

struct Name

unsinged A:4;
unsinged B:12;
;
参考技术D typedef struct

unsinged A;
unsinged B;
Name;

以上是关于C语言中如何将16位结构体定义为4位和12位两部分的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中GUID的结构体是啥

C语言语法

c语言中如何将结构中变量清空

c语言编程将16位无符号数的高8位和低8位交换.

C语言结构体中冒号的作用——位域

C语言结构体在定义的时候,各成员后面加冒号是啥意思?