我必须定义一个bitset类型来构建位数组。 在这些数组之间的位操作和/或/ xor可以 执行(比较它们,例如)和 占主导地位的行动。 我应该使用什么类型作为bitset类型?
我认为类型应该是最宽的NOT SIMULATED类型 编译器可以处理。 即如果编译器模拟64位类型(如果机器 或OS不支持它,例如掩蔽化合物 应该是一个简单的32位类型之间的操作 用来代替。 如何确定?
还有更多问题:
新的c99标题定义了一些类型(确切的宽度 整数类型),其中:
“它们的形式为intN_t和uintN_t。两种类型必须由N位表示,没有填充位.intN_t必须编码为二进制补码有符号整数,uintN_t必须编码为无符号整数。这些类型是可选的,除非实现支持宽度为8,16,32或64的类型,然后它们应该将它们键入相应的N类型。任何其他N都是可选的。“
所以我认为考虑检查64位类型的实现 是第一步,对吧?
我的项目使用SDL库,#define一个宏:
#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
所以也许我可以定义bitset类型 取决于该宏(然而,它不是最佳的, 因为我想写代码sdl indipendent)。
告诉我你的意见。
答案 0 :(得分:1)
没有一种简单的方法来确定非模拟整数类型的最大大小,并且大多数人都懒得去尝试。您可以选择两种方法中的任何一种,这两种方法都可以。
如果你想检测模拟vs本机,你可能会对具有不同大小的乘法的测试程序运行一些时序测试。
答案 1 :(得分:0)
对于信号和fd集,传统的Unix实践是使用unsigned long
(实际上历史上它甚至可能是long
,但是对于位集使用签名类型是一个非常糟糕的想法,几乎可以肯定导致未定义的行为)。虽然一些古老的16位机器可能比系统字大小long
,但我认为你很难找到任何具有该问题的现代机器。另一方面,64位Windows具有32位long
,因此您无法获得最佳类型,但为了简单起见,您可能也会使用它,
如果您有C99 stdint.h
,另一种方法是使用uintptr_t
。这几乎肯定是机器字大小。
另一种方法,肯定胜过简单,只是总是使用字节。
最后请注意,在小端系统上,无论您使用何种类型的大小,内存中的表示都是相同的。