是否可以在C或C ++中使用例如6位有符号整数或11位有符号整数(或任何n位整数,其中n!= 2 ^ x)?
答案 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位的倍数。
对于实际操作,您可以使用任意数量的位来模拟类型,但需要花费一些运行时开销。