显示优化的结构 #包括 类型定义结构_八位字节 { 字符tft_op:3; 字符e_位:1; 项目组字符编号:4; }八重奏; int main() { 八重奏; st_octet.tft_op=0x8; st_八位组e_位=0x1; st_八位组编号_pkt=0x10; char*ptr=(char*)&st_八位组; printf(“%#x\n”,*ptr); 返回0; }

显示优化的结构 #包括 类型定义结构_八位字节 { 字符tft_op:3; 字符e_位:1; 项目组字符编号:4; }八重奏; int main() { 八重奏; st_octet.tft_op=0x8; st_八位组e_位=0x1; st_八位组编号_pkt=0x10; char*ptr=(char*)&st_八位组; printf(“%#x\n”,*ptr); 返回0; },c,C,这里我想在tft_op中存储3位,1位e_位,4位no_of_pkt,但我希望o/p作为一个组合的1字节,也就是说,希望o/p作为FA,但我得到的o/p是0x8。我应该怎么做才能将o/p作为FA一般来说,位字段在C中定义不好,如果可能的话应该避免。由于内存填充、endianness等原因,很难判断位在内存中是如何对齐的。但要解决代码的一些具体问题: 首先,必须将结构成员更改为unsigned char或unsigned int,否则将丢失一位来表示符号。 tft_op-成员只有三位宽,但您尝试分

这里我想在tft_op中存储3位,1位e_位,4位no_of_pkt,但我希望o/p作为一个组合的1字节,也就是说,希望o/p作为FA,但我得到的o/p是0x8。我应该怎么做才能将o/p作为FA

一般来说,位字段在C中定义不好,如果可能的话应该避免。由于内存填充、endianness等原因,很难判断位在内存中是如何对齐的。但要解决代码的一些具体问题:

首先,必须将结构成员更改为
unsigned char
unsigned int
,否则将丢失一位来表示符号。
tft_op
-成员只有三位宽,但您尝试分配一个需要4位(0x8=0b1000)的值。它最终在内存中被分配了三个零(无论如何,在这台机器上,这同样取决于endianness等)。它成功地将
e_位
设置为1。_pkt的
no_
tft_op
存在相同的问题,0x10(=0b10000)需要五位,但字段宽度仅为4位。因此,该成员被指定为零。最后,您的位字段如下所示:
000:1:0000
,或
0001000
,或
0x8

通常,位字段在C中定义不好,如果可能,应该避免使用。由于内存填充、endianness等原因,很难判断位在内存中是如何对齐的。但要解决代码的一些具体问题:

首先,必须将结构成员更改为
unsigned char
unsigned int
,否则将丢失一位来表示符号。
tft_op
-成员只有三位宽,但您尝试分配一个需要4位(0x8=0b1000)的值。它最终在内存中被分配了三个零(无论如何,在这台机器上,这同样取决于endianness等)。它成功地将
e_位
设置为1。_pkt的
no_
tft_op
存在相同的问题,0x10(=0b10000)需要五位,但字段宽度仅为4位。因此,该成员被指定为零。最后,您的位字段如下所示:
000:1:0000
,或
0001000
,或
0x8

st_octet.tft\u op=0x8;//超出范围,最大值为7

st_octet.no_of_pkt=0x10;//超出范围,最大值为0xF


程序正确,值不正确。

st_octet.tft_op=0x8;//超出范围,最大值为7

st_octet.no_of_pkt=0x10;//超出范围,最大值为0xF


程序正确,值不正确。

您的值对于分配的空间来说太大:

#include <stdio.h>
typedef struct _octet
{
char tft_op:3;
char e_bit:1;
char no_of_pkt:4;
}octet_t;

int main()
{
octet_t st_octet;
st_octet.tft_op = 0x8;
st_octet.e_bit = 0x1;
st_octet.no_of_pkt = 0x10;
char *ptr = (char*)&st_octet;
printf("%#x\n",*ptr);
return 0;
}
因此,有效的结果是:

0x8 = 1000b - four bits, not three
0x1 = 1b - but if char is signed you can only have 0 and -1!
0x10 = 16 = 10000b - five bits, you'be allocated four
但您假设结构中的第一项位于位位置7(最高有效位),但标准(据我所知)没有指定位的起始位置(可以是位0,最低有效位),并且查看您的输出,我猜第一个字段是最低有效位,因此您有:

11111010b
其中,a是tft_op,b是e_位,c是p的no_。要获得0xfa,请执行以下操作之一:

ccccbaaa
或者,如果顺序是相反的:

tft_op = 2
e_bit = 1
no_of_pkt = 15
另外,不要做
char*ptr=(char*)&st_八位组使用工会调查:

tft_op = 7
e_bit = 1
no_of_pkt = 10

您的值对于分配的空间太大:

#include <stdio.h>
typedef struct _octet
{
char tft_op:3;
char e_bit:1;
char no_of_pkt:4;
}octet_t;

int main()
{
octet_t st_octet;
st_octet.tft_op = 0x8;
st_octet.e_bit = 0x1;
st_octet.no_of_pkt = 0x10;
char *ptr = (char*)&st_octet;
printf("%#x\n",*ptr);
return 0;
}
因此,有效的结果是:

0x8 = 1000b - four bits, not three
0x1 = 1b - but if char is signed you can only have 0 and -1!
0x10 = 16 = 10000b - five bits, you'be allocated four
但您假设结构中的第一项位于位位置7(最高有效位),但标准(据我所知)没有指定位的起始位置(可以是位0,最低有效位),并且查看您的输出,我猜第一个字段是最低有效位,因此您有:

11111010b
其中,a是tft_op,b是e_位,c是p的no_。要获得0xfa,请执行以下操作之一:

ccccbaaa
或者,如果顺序是相反的:

tft_op = 2
e_bit = 1
no_of_pkt = 15
另外,不要做
char*ptr=(char*)&st_八位组使用工会调查:

tft_op = 7
e_bit = 1
no_of_pkt = 10

那么我如何存储这个值呢。我想存储tft_op=111;e_位=0;no_of_pkt=1000我必须输入这样的东西我怎么能这样做,约束是我不能使用整个字符,因为当i o/p o想要11111000作为o/p的十六进制等价物时,数据应该是11111000。如果你想要
tft_op
为111的二进制,给它分配十六进制值0x7,对于结构的其他成员也是如此。您还应该将结构的成员更改为
无符号字符
,或
无符号整数
。现在,成员
e_bit
只能保存值0和-1,正如Skizz在下面指出的那样。那么如何存储该值呢。我想存储tft_op=111;e_位=0;no_of_pkt=1000我必须输入这样的东西我怎么能这样做,约束是我不能使用整个字符,因为当i o/p o想要11111000作为o/p的十六进制等价物时,数据应该是11111000。如果你想要
tft_op
为111的二进制,给它分配十六进制值0x7,对于结构的其他成员也是如此。您还应该将结构的成员更改为
无符号字符
,或
无符号整数
。正如Skizz在下面指出的那样,现在的成员
e_bit
只能保存值0和-1。