如何根据C11使用二进制前缀?

时间:2012-01-26 07:18:03

标签: c compiler-construction standards standards-compliance c11

我目前正在开始使用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的正确二进制表示法是什么?

4 个答案:

答案 0 :(得分:17)

C没有二进制常量。 (即使在C11中也不受支持。)

他们被提议作为C99的补充,但这个命题被拒绝了。

来自C99理由文件:

  

由于缺乏先例和效用不足,提议添加二进制常量。

您说您正在使用基于gcc的编译器,而gcc支持二进制常量:它们是C语言的GNU扩展。

  

整数常量可以写成二进制常量,由01数字序列组成,前缀为0b0B。这在位级操作很多的环境中非常有用(如微控制器)。

有关更多信息,请参阅有关二进制常量的gcc页面:

http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html

答案 1 :(得分:3)

C11没有二进制文字;它只有十进制,八进制和十六进制,如标准6.4.4.1节所述。这与C99相同。

6.6第10段说:

  

实现可以接受其他形式的常量表达式。

如果我理解正确的话,它允许你的编译器提供的那种扩展;这与C99相同。

通常的解决方法是使用十六进制文字;每个十六进制数字对应四个二进制数字。 (当然0b000可以简单地写成0。)

答案 2 :(得分:3)

关于标准:

  • ANSI C /"严格ANSI"通常指的是C的第一个标准版本,仅在美国1989年标准化。有时它被称为" C89"。
  • ANSI C / 89在1990年C成为国际C标准ISO / IEC 9899:1990时被淘汰,被称为" C90"。 C89和C90在技术细节方面是等效的。
  • C90在1999年ISO C更新时已经过时了。新标准称为" C99"。
  • C99在2011年已经过时。新标准被称为" C11"。

关于编译器问题:

  • C89 / C90不允许//评论。它们是在C99中引入的。它们尚未在C11中删除。
  • 二进制表示法从未成为任何C标准的一部分。

结论:

  • 您最有可能在C90编译器上编译代码,并提供一些非标准扩展。

答案 3 :(得分:1)

二进制前缀不是标准的。将它们转换为八进制(0)或十六进制(0x),而不是标准中定义的前缀。

此外,//评论是在C99标准中引入的,它们不存在于C89 ANSI标准中。这就是你的编译器给你一个警告的原因。