n 位有符号数,其中 n 不是 2 的幂

n-bit signed number where n is not a power of 2

是否可以在 C 或 C++ 中使用 6 位有符号整数或 11 位有符号整数(或任何 n 位整数,其中 n != 2^x)?

C 和 C++ 都要求一个字节,一个 unsigned char,至少是 8 位。但是没有上限,对2的幂没有限制。所以原则上 CHAR_BIT (每个字节的位数)可以是例如10.

这主要是为了向后兼容。在早期,有基于例如的计算机。 12-bit bytes。为了迎合现代 8 位系统,C99 引入了 stdint.h header,它提供的类型如果受支持,可以保证 8 位的倍数。

对于 in-practice,您可以模拟具有任意位数的类型,但要付出一些 run-time 的开销。

当然 可能 C 或 C++ 实现可以提供像这样大小的类型,但大多数实现不会提供像这样大小的内置类型,因为 ( 1) 很少遇到它们,并且 (2) 大多数处理器不支持对此类类型的直接操作。

如果您尝试将这些整数用作二进制标志组,请考虑使用 std::bitset 作为其他答案所建议的。这甚至可能是更好的选择,因为它明确表明您正在使用一组标志。例如:

std::bitset<6> bits; // Six independent bit flags
bits[3] = true;      // Set the third flag

如果您尝试将它们用作实际整数类型,只是受它们使用的位数的限制,请考虑使用位域,如下所示:

struct uint6_t {
    uint64_t value : 6; // 6 bits, unsigned
};
struct int6_t {
    int64_t value : 6;  // 6 bits, signed
};

然后您可以将 uint6_tvalue 字段用作六位整数。这仅适用于小于您在位域中使用的基础类型的大小的大小,它应该适用于 6 或 11 之类的大小,但不适用于 137 或 271 之类的大小。请注意 - 这些对象的实际大小将由于编译器引入的填充位,可能不是六位,但它们的功能仍然像六位整数。

显然,C++ 模板允许您执行如下操作:

template <unsigned int NumBits> struct uint {
    uint64_t data : NumBits;
};
template <unsigned int NumBits> struct Int {
    int64_t data : NumBits;
};

uint<6> value;
value.data = 0; // Or other uses

Int<6> value;
value.data = -1; // Or other uses

编辑:根据您的尝试,您似乎正在寻找这样的东西:

uint<6> value;
value.data = -3;
std::cout << value.data << std::endl; // Prints 3

您可以使用位域来模拟:

struct int6_t{
    int32_t intPart : 6; // 6 bit integer
}

int_6_t mySilly6bitInt;
mySilly6bitInt.intPart = 5;