gpt4 book ai didi

c++ - c bitfields struct 中 long int 的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 05:41:29 26 4
gpt4 key购买 nike

当我运行以下代码时,我观察到奇怪的行为。我使用一个结构创建了一个位域,我想在其中使用 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 位。将值移动大于或等于其类型中的位数的量具有未定义的行为。

更改 indexunsigned long (位移位符号类型是不明智的)。或者您可以更改 1<<index1L << index ,甚至 1LL << index .

正如其他人所指出的,test未初始化。您可以像这样将其初始化为全零:

 struct foo test = { 0 };

正确的printf size_t 的格式是%zu , 不是 %ld .

并且修改您的代码并不是一个坏主意,因此它不依赖于 long 的不可移植假设。是 64 位。它可以窄到 32 位。考虑使用 uint_N_t <stdint.h> 中定义的类型.

我还应该提到 int 以外类型的位字段, unsigned int , signed int , 和 _Bool (或 bool )是实现定义的。

关于c++ - c bitfields struct 中 long int 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17411746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com