0

我必须定义一个 bitset 类型来构建位数组。在这些数组之间可以执行和/或/xor之类的位操作(例如,比较它们)并且是主要操作。我应该使用什么类型作为 bitset 类型?

我认为该类型应该是编译器可以处理的最广泛的 NOT SIMULATED 类型。即,如果编译器模拟 64 位类型(例如,如果机器或操作系统不支持它)屏蔽简单和之间的复合操作,则应使用 32 位类型。如何确定?

还有更多问题:

新的 c99 标头定义了一些类型(精确宽度整数类型),其中:

“它们的形式是 intN_t 和 uintN_t。这两种类型都必须用 N 位表示,没有填充位。intN_t 必须编码为二进制补码有符号整数,uintN_t 必须编码为无符号整数。除非实现支持类型,否则这些类型是可选的宽度为 8、16、32 或 64,则应将它们类型定义为具有相应 N 的相应类型。任何其他 N 都是可选的。

所以我认为检查 64 位类型的实现是第一步,对吧?

我的项目使用 SDL 库,它#defines 一个宏:

#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 独立)。

说说你对的看法。

4

2 回答 2

1

没有一种简单的方法来确定最大大小的非模拟整数类型,而且大多数人都懒得去尝试。您可以采用两种方法中的任何一种,这两种方法都有效。

  1. 决定使用 32 位整数,因为它们随处可用。
  2. 决定您将拥有一个配置宏(不一定来自 SDL),它控制您使用 32 位还是 64 位(或 16 位或 128 位)数据类型。您在配置构建时指定“正确”值。

如果您想检测仿真与原生,您可能会在具有各种乘法大小的测试程序上运行一些时序测试。

于 2011-06-04T06:10:10.043 回答
0

对于信号和 fd 集,传统的 Unix 实践是使用unsigned long(实际上在历史上它甚至可能是long,但是对位集使用有符号类型是一个非常非常糟糕的主意,并且几乎肯定会导致未定义的行为)。虽然一些古老的 16 位机器的字长可能long比系统字长大,但我认为你很难找到任何有这个问题的现代机器。另一方面,64 位 Windows 有 32-bit long,因此您不会获得最佳类型,但为了简单起见,您不妨只使用它,

如果您有 C99stdint.h可供使用,另一种方法是使用uintptr_t. 这几乎肯定是机器字长。

还有另一种方法,它肯定会在简单性上获胜,就是总是使用字节。

最后,请注意,在小端系统上,无论您使用什么类型大小,内存中的表示都是相同的。

于 2011-06-04T12:31:26.580 回答