如何在C中声明位?

问题描述 投票:-1回答:5

我正在尝试这样做:

uint64_t key = 0110000010110110011001101111101000111111111010001011000110001110;

不行。 GCC

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

知道为什么吗?

c gcc bit-manipulation literals
5个回答
6
投票

虽然draft C99 standarddraft C11 standard都不支持二进制文字,但是你特别提到gcc它有一个extension for binary literals,它说:

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

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

和= 0101010;

看起来像clang也支持an extensionsee it live):

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

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


2
投票

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

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


1
投票

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

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

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

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


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 - > 0xf。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.