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_t
的 value
字段用作六位整数。这仅适用于小于您在位域中使用的基础类型的大小的大小,它应该适用于 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++ 中使用 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_t
的 value
字段用作六位整数。这仅适用于小于您在位域中使用的基础类型的大小的大小,它应该适用于 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;