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

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

本文关键字:不是 的幂 其中 符号      更新时间:2023-10-16

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

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;

C和C++都要求一个字节unsigned char至少为8位。但没有上限,也没有对二权的限制。因此原则上CHAR_BIT(每字节的比特数)可以是例如10。

这主要是为了向后兼容性。在早期,存在基于例如12位字节的计算机。为了满足现代8位系统的需要,C99引入了stdint.h报头,该报头提供了如果支持的话可以保证8位倍数的类型。

对于实际中的,您可以模拟具有任意位数的类型,但需要一些运行时开销。

相关文章: