显示优化的结构 #包括 类型定义结构_八位字节 { 字符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位,1位e_位,4位no_of_pkt,但我希望o/p作为一个组合的1字节,也就是说,希望o/p作为FA,但我得到的o/p是0x8。我应该怎么做才能将o/p作为FA一般来说,位字段在C中定义不好,如果可能的话应该避免。由于内存填充、endianness等原因,很难判断位在内存中是如何对齐的。但要解决代码的一些具体问题: 首先,必须将结构成员更改为显示优化的结构 #包括 类型定义结构_八位字节 { 字符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-成员只有三位宽,但您尝试分
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。