8

我目前开始使用C30C基于GCC微芯片的编译器用于他们的设备)对微控制器进行编程,我出于好奇PIC24而启用。Strict ANSI warnings首先,我不知道在 C11 中,像 // 这样的注释标记是“错误的”,而我应该使用 /* blah blah */,但真正让我吃惊的是对一行代码的警告。

“警告:使用非标准二进制前缀”

代码行是:

OSCCONbits.COSC = 0b000;

我在网上查看了 C11 的一份草案(ISO/IEC 9899:2011),在 C 中找不到任何关于二进制前缀的信息。http://www.open-std.org/jtc1/sc22/wg14/www /docs/n1570.pdf

根据 C11,C 的正确二进制表示法是什么?

4

4 回答 4

22

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

它们被提议作为 C99 的补充,但该提议被拒绝。

来自 C99 基本原理文档:

由于缺乏先例和实用性不足,拒绝了添加二进制常量的提议。

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

整数常量可以写成二进制常量,由一系列01数字组成,前缀为0bor 0B。这在位级别上进行大量操作的环境(如微控制器)中特别有用。

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

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

于 2012-01-26T08:59:21.983 回答
4

关于标准:

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

关于您的编译器问题:

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

结论:

  • 您很可能在 C90 编译器上编译代码,并提供了一些非标准扩展。
于 2012-01-26T07:46:42.297 回答
3

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

6.6 第 10 段说:

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

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

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

于 2012-01-26T07:35:11.283 回答
2

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

此外,//注释是在 C99 标准中引入的,它们在 C89 ANSI 标准中不存在。这就是为什么你的编译器会给你一个警告。

于 2012-01-26T07:35:54.363 回答