C 为什么结构成员似乎具有溢出值?
在下面的代码中,我得到一个=-1作为输出。我猜,这是因为我溢出了3位的A成员。 在这方面,我有两个问题:C 为什么结构成员似乎具有溢出值?,c,struct,structure,padding,bit,C,Struct,Structure,Padding,Bit,在下面的代码中,我得到一个=-1作为输出。我猜,这是因为我溢出了3位的A成员。 在这方面,我有两个问题: 对于成员A,编译器不应该考虑最后3位而忽略其余部分吗?为什么这个值是负值 如果考虑了所有位,为什么要将B=0的值作为输出 我原以为A的值是7,但我显然误解了什么。请帮忙 #include <stdio.h> typedef struct { char A: 3; char B: 3; char C: 3; }my_struct; my_struct new_obje
#include <stdio.h>
typedef struct
{
char A: 3;
char B: 3;
char C: 3;
}my_struct;
my_struct new_object = {0};
void main(void)
{
new_object. A = 63;
printf("A = %d\n", new_object.A);
printf("B = %d\n", new_object.B);
}
#包括
类型定义结构
{
字符A:3;
字符B:3;
字符C:3;
}我的结构;
my_struct new_object={0};
真空总管(真空)
{
新对象A=63;
printf(“A=%d\n”,新对象.A);
printf(“B=%d\n”,新对象.B);
}
我以为A的值是7
嗯。7是二进制的111。但是你有一个签名字符(显然,因为你告诉我们它是-1)。所以你需要做:
typedef struct
{
unsigned char A: 3;
unsigned char B: 3;
unsigned char C: 3;
}my_struct;
将63分配给未定义的行为不是吗?所以结果可能是任何东西。@CostantinoGrana:不,不是。它不是作为
charc=0xffff代码>不是。感谢C的隐式转换。@alk:谢谢你提供的信息。我不知道整数转换中包含位字段。谢谢。将其设为unsigned会为a提供7的值。但是,我现在很困惑,为什么在未写入unsigned的情况下它会给我-1的值。我不应该得到-3的值,因为它是3位的。最高有效位可用于符号,其余两位应设置?这不应该发生吗?我正在使用链接中的编译器:111
中的二元补码二进制是-4+2+1,实际上是-1。一切如期而至-3是101。哎呀!谢谢你,约翰。我完全忘了负数存储在2的补码中。愚蠢的我。对不起,没问题。世界上只有10种人:懂二进制的人和不懂二进制的人。