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

标签 c++ c integer bit

在 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

关于c++ - n 位有符号数,其中 n 不是 2 的幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38446328/

相关文章:

C 段错误

c++ - Binutils ld 链接器如何配置仿真模式(使用 mingw 构建后不支持仿真)

c++ - 如何检查一个类型是否直接派生自另一个类型?

c++ - 跨平台 Objective-C/C++ 开发

c++ - 如何让 gcc 警告缩小函数参数

c - 如何更改一个功能的优化级别?

自由 m*n 矩阵二维分配的正确方法

java - 为什么我的程序不能按预期运行?

c++ - 为什么我不能使用 long long int 类型? C++

c - 如何找到数组中最长运行的长度?