8

私は現在、C30(デバイス用のマイクロチップにC基づくコンパイラー)を使用してマイクロコントローラーをプログラミングすることから始めており、好奇心から有効にしました。まず、C11のコメントマーキングで//が「間違っている」ことを知りませんでした。代わりに、/ * blah blah * /を使用する必要がありますが、本当に驚いたのは、コード行に対するこの警告です。GCCPIC24Strict ANSI warnings

「警告:非標準のバイナリプレフィックスの使用」

コードの行は次のとおりです。

OSCCONbits.COSC = 0b000;

C11(ISO / IEC 9899:2011)のドラフトの1つをオンラインで調べましたが、Cのバイナリプレフィックスについては何も見つかりません。http://www.open-std.org/jtc1/sc22/wg14/www /docs/n1570.pdf

C11によるCの正しいバイナリ表記は何ですか?

4

4 に答える 4

22

Cには2進定数がありません。(C11でもサポートされていません。)

それらはC99への追加として提案されましたが、提案は拒否されました。

C99根拠文書から:

2進定数を追加する提案は、前例の欠如と不十分な有用性のために却下されました。

コンパイラベースgccgccバイナリ定数をサポートしているとおっしゃいました。これらはC言語のGNU拡張機能です。

0整数定数は、とのシーケンスで構成1され、接頭辞0bまたはが付いた2進定数として記述できます0B。これは、ビットレベルで多く動作する環境(マイクロコントローラーなど)で特に役立ちます。

詳細gccについては、バイナリ定数に関するページを参照してください。

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

于 2012-01-26T08:59:21.983 に答える
4

標準について:

  • ANSI C /「StrictANSI」は通常、米国1989でのみ標準化されたCの最初の標準バージョンを指します。「C89」と呼ばれることもあります。
  • ANSI C / 89は、Cが国際C標準であるISO / IEC 9899:1990(「C90」と呼ばれる)になった1990年に廃止されました。技術的な詳細に関しては、C89とC90は同等です。
  • C90は、ISOCが更新された1999年に廃止されました。新しい規格は「C99」と呼ばれます。
  • C99は2011年に廃止されました。新しい標準は「C11」と呼ばれます。

コンパイラの問題について:

  • C89/C90は//コメントを許可しません。それらはC99で導入されました。それらはC11では削除されていません。
  • バイナリ表記は、C標準の一部ではありませんでした。

結論:

  • ほとんどの場合、C90コンパイラでコードをコンパイルしており、いくつかの非標準の拡張機能が利用可能です。
于 2012-01-26T07:46:42.297 に答える
3

C11にはバイナリリテラルがありません。標準のセクション6.4.4.1で説明されているように、10進数、8進数、および16進数のみが含まれます。これはC99から変更されていません。

6.6パラグラフ10は言う:

実装は、他の形式の定数式を受け入れる場合があります。

これは、私が正しく理解していれば、コンパイラが提供する種類の拡張を許可します。これもC99から変更されていません。

通常の回避策は、16進リテラルを使用することです。各16進数は、4つの2進数に対応します。(そしてもちろん、0b000単純に次のように書くことができます0。)

于 2012-01-26T07:35:11.283 に答える
2

バイナリプレフィックスは標準ではありません。0代わりに、それらを8進数( )または16進数()に変換します。これら0xは、標準で定義されているプレフィックスのみです。

また、//コメントはC99標準で導入されましたが、C89ANSI標準には存在しません。そのため、コンパイラは警告を出します。

于 2012-01-26T07:35:54.363 に答える