繁体   English   中英

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

[英]How do I use a binary prefix in accordance with C11?

我目前正在开始使用C30编程微控制器(基于GCC C编译器,用于他们的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的正确二进制表示法是什么?

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

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

来自C99理由文件:

添加二进制常量的提议由于缺乏先例和实用程序不足而被拒绝。

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

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

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

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

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

6.6第10段说:

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

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

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

关于标准:

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

关于编译问题:

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

结论:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM