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

时间:2016-07-18 21:31:01

标签: c++ c integer bit

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

3 个答案:

答案 0 :(得分:4)

可能可能 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_t的{​​{1}}字段用作六位整数。这仅适用于小于您在位域内使用的基础类型大小的大小,这适用于6或11等大小,但不适用于137或271等大小。一个注意事项 - 这些对象的实际大小将由于编译器引入的填充位,可能不是6位,但它们的功能仍然是6位整数。

显然,C ++模板允许你这样做:

value

编辑:根据您的目的,看起来您正在寻找类似的内容:

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

答案 1 :(得分:3)

您可以使用位域来模拟这个:

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

int_6_t mySilly6bitInt;
mySilly6bitInt.intPart = 5;

答案 2 :(得分:1)

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

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

对于实际操作,您可以使用任意数量的位来模拟类型,但需要花费一些运行时开销。