代码之家  ›  专栏  ›  技术社区  ›  David 天宇 Wong

如何在C中声明位?

  •  -1
  • David 天宇 Wong  · 技术社区  · 11 年前

    我正在努力做到这一点:

    uint64_t key = 0110000010110110011001101111101000111111111010001011000110001110;
    

    不起作用。 GCC

    警告:整数常量对于其类型太大

    知道为什么吗?

    5 回复  |  直到 11 年前
        1
  •  6
  •   Shafik Yaghmour    6 年前

    尽管 draft C99 standard 也不是 draft C11 standard 支持二进制文字,因为您特别提到 gcc 它有一个 extension for binary literals 上面写着:

    整数常量可以写成二进制常量,由0和1位数字组成,前缀为0b或0b。这在大量位级操作的环境(如微控制器)中尤其有用。

    他们给出了以下示例( see it live ):

    i=0b101010;

    看起来 clang 也支持这一点 an extension 以及( see it live ):

    识别[…]二进制文字(例如,0b10010)。Clang在所有语言模式中都支持此功能作为扩展。

    这在标准C++中也不可用,直到C++14 [lex.icon] .

        2
  •  2
  •   gsg    11 年前

    由于前导0被读作非常大的八进制文字,这可能不是您想要的。令人惊讶的是,C没有二进制文字。

    作为扩展, gcc 支持二进制文本 0b 前缀, 0b101010 。如果你不想依赖扩展,十六进制可能是最合理的选择。

        3
  •  1
  •   concept3d    11 年前

    使用十六进制十进制,它们更紧凑,可以表示二进制示例:

    0x01 // This is 0001
    0x02 // 0010
    

    按照你想要的方式使用二进制代码在别人的代码中尤其难看。

    同样,以0开头的数字(在您的示例中)将被解释为八进制。

        4
  •  1
  •   Brett Hale    11 年前

    要添加@Shafik的答案:

    #include <inttypes.h>
    #include <stdio.h>
    
    int main(void)
    {
        uint64_t i = UINT64_C(
            0b0110000010110110011001101111101000111111111010001011000110001110);
    
        printf("%" PRIX64 "\n", i) ;
        return 0;
    }
    

    合作对象: gcc -std=gnu99 -输出: 60B666FA3FE8B18E

    实际上,嵌入式系统对扩展的要求要严格得多,特别是如果你不幸被要求遵守诸如 MISRA-C 十六进制转换只是将4个二进制数字分组为0x0->0xf。

        5
  •  0
  •   Dinesh    11 年前

    我认为这是因为您超过了uint数据类型中可以存储的最大整数。 尝试使用布尔类型的数组。