我正在尝试这样做:
uint64_t key = 0110000010110110011001101111101000111111111010001011000110001110;
不起作用。 GCC
说
警告:整数常量对于其类型
来说太大
知道为什么吗?
答案 0 :(得分:6)
虽然draft C99 standard和draft 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数据类型中的最大整数。 尝试使用布尔类型数组。