我正在尝试这样做:
uint64_t key = 0110000010110110011001101111101000111111111010001011000110001110;
不行。 GCC
说
警告:整数常量对于其类型而言太大
知道为什么吗?
虽然draft C99 standard和draft C11 standard都不支持二进制文字,但是你特别提到gcc
它有一个extension for binary literals,它说:
整数常量可以写成二进制常量,由一系列'0'和'1'数字组成,前缀为'0b'或'0B'。这在位级操作很多的环境中非常有用(如微控制器)。
他们给出了以下示例(see it live):
和= 0101010;
看起来像clang
也支持an extension(see it live):
[...]二进制文字(例如,0b10010)被识别。 Clang支持此功能作为所有语言模式的扩展。
在C ++ 14 [lex.icon]之前,这在标准C ++中不可用。
由于前导0被读作一个非常大的八进制文字,这可能不是你想要的。令人惊讶的是,C没有二进制文字。
作为扩展,gcc
支持带有0b
前缀的二进制文字,例如0b101010
。如果您不想依赖扩展,十六进制可能是最合理的选择。
使用十六进制小数,它们更紧凑,可以表示二进制示例:
0x01 // This is 0001
0x02 // 0010
以你想要的方式使用二进制文件在某人的代码中特别难看。
同样以0开头的数字(在您的示例中)将被解释为八进制。
添加到@ 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。
我认为那是因为你超过了可以存储在uint数据类型中的最大整数。尝试使用布尔类型的数组。