如何在C中声明位?

时间:2014-02-07 14:55:10

标签: c gcc bit-manipulation literals

我正在尝试这样做:

uint64_t key = 0110000010110110011001101111101000111111111010001011000110001110;

不起作用。 GCC

  

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

来说太大

知道为什么吗?

5 个答案:

答案 0 :(得分:6)

虽然draft C99 standarddraft C11 standard都不支持二进制文字,但由于您明确提及gcc,因此它有一个extension for binary literals,其中包含:{/ p>

  

整数常量可以写成二进制常量,由一系列“0”和“1”数字组成,前缀为“0b”或“0B”。这在位级操作很多的环境中非常有用(如微控制器)。

他们提供了以下示例( see it live ):

  

i = 0b101010;

看起来clang也支持此an extension see it live ):

  

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

在C ++ 14 [lex.icon]之前,这在标准C ++中不可用。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

以你想要的方式使用二进制文件在某人的代码中特别难看。

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

答案 3 :(得分:1)

添加到@ 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 - &gt; 0xf。

答案 4 :(得分:0)

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