[英]c bitfields strange behaviour with long int in struct
运行以下代码时,我观察到奇怪的行为。 我通过使用结构创建一个位域,我想使用52位,所以我使用long int。 在我的系统上,long int的大小为64位,我在代码内对其进行了检查。 不知何故,当我尝试设置一位时,它总是设置了两位。 其中一个是我要设置的值,第二个是第一个值加32的索引。没人能告诉我,为什么呢?
#include <stdio.h>
typedef struct foo {
long int x:52;
long int:12;
};
int main(){
struct foo test;
int index=0;
printf("%ld\n",sizeof(test));
while(index<64){
if(test.x & (1<<index))
printf("%i\n",index);
index++;
}
test.x=1;
index=0;
while(index<64){
if(test.x & (1<<index))
printf("%i\n",index);
index++;
}
return 0;
}
Sry忘记发布输出,因此我的问题基本上是无法理解的...它给我的输出如下:
8
0
32
index
是int
类型,在您的系统上可能是32位。 将值移位大于或等于其类型的位数的位数具有未定义的行为。
将index
更改为unsigned long
(不建议使用移位型带符号类型)。 或者,您可以将1<<index
更改为1L << index
,甚至更改为1LL << index
。
正如其他人指出的那样, test
尚未初始化。 您可以像这样将其初始化为全零:
struct foo test = { 0 };
size_t
的正确printf
格式为%zu
,而不是%ld
。
修改您的代码并不是一个坏主意,因此它不取决于long
为64位的不可移植的假设。 它可以窄至32位。 考虑使用<stdint.h>
定义的uint_N_t
类型。
我还应该提到,除int
, unsigned int
, signed int
和_Bool
(或bool
)之外的其他类型的位字段是实现定义的。
您在代码中具有未定义的行为,因为您在不初始化结构的情况下检查了text.x
的位。 因为您没有初始化变量,所以它将包含随机数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.