首页 文章

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

提问于
浏览
-2

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

3 回答

  • 3

    C或C实现当然可以提供类似大小的类型,但是大多数实现都不会遇到它们,并且(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等大小 . 一个注意事项 - 这些对象的实际大小将由于编译器引入的填充位,可能不是6位,但它们的功能仍然是6位整数 .

    显然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
    

    EDIT :根据你're trying to do, it seems like you'寻找类似的东西:

    uint<6> value;
    value.data = -3;
    std::cout << value.data << std::endl; // Prints 3
    
  • 1

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

    struct int6_t{
        int32_t intPart : 6; // 6 bit integer
    }
    
    int_6_t mySilly6bitInt;
    mySilly6bitInt.intPart = 5;
    
  • 4

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

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

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

相关问题