我目前正在开始使用C30
编译微控制器(基于C
的{{1}}编译器来自微芯片的GCC
设备)并启用{{1出于好奇心。首先,我不知道在C11中评论标记如//是“错误的”而是我应该使用/ * blah blah * /,但真正让我感到惊讶的是对一行代码的警告。
“警告:使用非标准二进制前缀”
代码行是:
PIC24
我已经在线查看了C11(ISO / IEC 9899:2011)的一个草案,但在C中找不到关于二进制前缀的任何内容。http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
根据C11,C的正确二进制表示法是什么?
答案 0 :(得分:17)
C没有二进制常量。 (即使在C11中也不受支持。)
他们被提议作为C99的补充,但这个命题被拒绝了。
来自C99理由文件:
由于缺乏先例和效用不足,提议添加二进制常量。
您说您正在使用基于gcc
的编译器,而gcc
支持二进制常量:它们是C语言的GNU扩展。
整数常量可以写成二进制常量,由
0
和1
数字序列组成,前缀为0b
或0B
。这在位级操作很多的环境中非常有用(如微控制器)。
有关更多信息,请参阅有关二进制常量的gcc
页面:
答案 1 :(得分:3)
C11没有二进制文字;它只有十进制,八进制和十六进制,如标准6.4.4.1节所述。这与C99相同。
6.6第10段说:实现可以接受其他形式的常量表达式。
如果我理解正确的话,它允许你的编译器提供的那种扩展;这与C99相同。
通常的解决方法是使用十六进制文字;每个十六进制数字对应四个二进制数字。 (当然0b000
可以简单地写成0
。)
答案 2 :(得分:3)
关于标准:
关于编译器问题:
结论:
答案 3 :(得分:1)
二进制前缀不是标准的。将它们转换为八进制(0
)或十六进制(0x
),而不是标准中定义的前缀。
此外,//
评论是在C99标准中引入的,它们不存在于C89 ANSI标准中。这就是你的编译器给你一个警告的原因。