如何使用uint64\t数据类型在C中实现位图数组?
我正在尝试用C语言实现位图数组。 我已阅读并复制了此链接中的粘贴: x=7 它不起作用。x值变成1295807169等,这不是我所期望的。我希望它和以前一样(1,3,7)。有人能帮我修复那个代码吗如何使用uint64\t数据类型在C中实现位图数组?,c,bitmap,64-bit,C,Bitmap,64 Bit,我正在尝试用C语言实现位图数组。 我已阅读并复制了此链接中的粘贴: x=7 它不起作用。x值变成1295807169等,这不是我所期望的。我希望它和以前一样(1,3,7)。有人能帮我修复那个代码吗 我知道“问题是代码使用了1整数常量。所有这些整数常量的类型与变量类似,并且是默认的int,这可能与系统上的int32\t相同 将有符号整数(如int32\t左移超过30位)调用未定义的行为,因为您将把数据移到有符号位。根据经验,不要将有符号变量与按位运算符一起使用 在这种情况下,正确的修复方法是替换1
我知道“问题是代码使用了
1
整数常量。所有这些整数常量的类型与变量类似,并且是默认的int
,这可能与系统上的int32\t
相同
将有符号整数(如int32\t
左移超过30位)调用未定义的行为,因为您将把数据移到有符号位。根据经验,不要将有符号变量与按位运算符一起使用
在这种情况下,正确的修复方法是替换
1的每个实例,它是蓝色的,但1
是一个int
常量。强制转换可能有帮助,例如:(word\t)1
。否则,您的部分计算可能在int
中完成,而部分计算可能在uint64\u t
中完成,这可能会产生副作用。我建议您以十六进制打印位值,这会让您更好地了解正在进行的操作。在printf调用中使用%x(同样,printf也不希望使用64位类型,除非您使用ll size修饰符告诉它,因此printf(“x=%llx\n”,x);否则您将只获得值的高32位或低32位(取决于系统端度)部分。请注意,您没有将x
设置为已知值(如0
)在开始设置位之前。当您开始设置不确定值时,会得到不确定的结果。也可能值得以十六进制打印结果,而不是以十进制打印结果。如果以十六进制打印,则更容易看到1295807169(基数10)等数字作为位模式。
#include <limits.h> /* for CHAR_BIT */
#include <stdint.h> /* for uint32_t */
#include <stdio.h>
#include <stdlib.h>
typedef uint32_t word_t; // I want to change this, from uint32_t to uint64_t
enum { BITS_PER_WORD = sizeof(word_t) * CHAR_BIT };
#define WORD_OFFSET(b) ((b) / BITS_PER_WORD)
#define BIT_OFFSET(b) ((b) % BITS_PER_WORD)
void set_bit(word_t *words, int n) {
words[WORD_OFFSET(n)] |= (1 << BIT_OFFSET(n));
}
void clear_bit(word_t *words, int n) {
words[WORD_OFFSET(n)] &= ~(1 << BIT_OFFSET(n));
}
int get_bit(word_t *words, int n) {
word_t bit = words[WORD_OFFSET(n)] & (1 << BIT_OFFSET(n));
return bit != 0;
}
int main(){
printf("sizeof(word_t)=%i\n",sizeof(word_t));
printf("CHAR_BIT=%i\n",CHAR_BIT);
printf("BITS_PER_WORD=%i\n",BITS_PER_WORD);
word_t x;
set_bit(&x, 0);
printf("x=%u\n",x);
set_bit(&x, 1);
printf("x=%u\n",x);
set_bit(&x, 2);
printf("x=%u\n",x);
return 0;
}
[izzatul@mycomputer latihan]$ ./a.out
sizeof(word_t)=8
CHAR_BIT=8
BITS_PER_WORD=64
x=1
x=3
(word_t)1 << BIT_OFFSET(n)