C语言中的位集类型使用哪种类型

| 我必须定义一个位集类型来构建位数组。 在这些数组之间,位操作和/或/或 被执行(例如比较),并且 主要操作。 我应该使用哪种类型作为位集类型? 我认为该类型应该是最宽的NOT SIMULATED类型 编译器可以处理。 即如果编译器模拟64位类型(如果计算机 或操作系统不支持,例如)掩蔽化合物 简单和32位类型之间的运算应为 代替。 如何确定呢? 还有更多问题: 新的c99标头定义了一些类型(精确宽度 整数类型),其中: \“这些格式为intN_t和uintN_t。这两种类型都必须由N个位数精确地表示,没有填充位。intN_t必须编码为二进制补码有符号整数,而uintN_t必须编码为无符号整数。这些类型是可选的,除非该实现支持宽度为8、16、32或64的类型,然后它将类型定义为具有相应N的相应类型。其他任何N是可选的。 所以我认为检查64位类型的实现 是第一步,对吗? 我的项目使用SDL库,该库#定义了一个宏:
#ifdef SDL_HAS_64BIT_TYPE
typedef int64_t     Sint64;
#ifndef SYMBIAN32_GCCE
typedef uint64_t    Uint64;
#endif
#else
/* This is really just a hack to prevent the compiler from complaining */
typedef struct {
    Uint32 hi;
    Uint32 lo;
} Uint64, Sint64;
#endif
所以也许我可以对位集类型进行定义 取决于该宏(但这不是最佳选择, 因为我想写sdl indipendent的代码)。 告诉我您的意见。     
已邀请:
        没有一种简单的方法可以确定最大长度的非模拟整数类型,并且大多数人都不会去尝试。您可以采用两种方法中的任一种,两种方法都可以。 决定使用32位整数,因为它们随处可见。 确定您将拥有一个配置宏(不一定是SDL中的一个),该宏控制您使用的是32位还是64位(或16位或128位)数据类型。您在配置内部版本时指定\'right \'值。 如果要检测仿真还是本机,则可能会在具有各种乘法大小的测试程序上运行一些时序测试。     
        对于信号集和fd集,传统的Unix惯例是使用ѭ1(实际上从历史上看甚至可能是
long
,但是对位集使用带符号类型是一个非常非常糟糕的主意,并且几乎肯定会导致未定义的行为)。虽然某些古老的16位计算机可能比系统字长大2磅,但我认为您很难找到任何存在此问题的现代计算机。另一方面,64位Windows具有32位
long
,因此您不会获得最佳类型,但为简单起见,您也可以使用它, 如果您拥有C99
stdint.h
,那么另一种方法是使用
uintptr_t
。那几乎肯定是机器字的大小。 绝对在简单性上取胜的另一种方法是始终使用字节。 最后,请注意,在小端系统上,无论您使用什么类型的大小,内存中的表示形式都是相同的。     

要回复问题请先登录注册