2

C では、同じソース コードで異なるプロセッサ アーキテクチャをターゲットにすることが一般的 (または少なくとも可能) です。また、プロセッサ アーキテクチャによって整数サイズの定義が異なることもよくあります。コードの移植性を高め、整数サイズの制限を回避するには、C 標準の整数ヘッダーを使用することをお勧めします。ただし、これが実際にどのように実装されているかについては混乱しています。

x86 用に書かれた小さな C プログラムを作成し、それを 8 ビット マイクロコントローラーに移植することにした場合、マイクロコントローラー コンパイラーは 'uint32_t' をネイティブの整数型に変換する方法をどのように認識しますか?

C コンパイラを作成する際にマッピング要件はありますか? コンパイラを C99 互換にする場合、すべての uint32_t をネイティブ型に置き換えるマッピング機能が必要ですか?

ありがとう!

4

3 に答える 3

2

通常<stdint.h>、同等のものを含む

typedef int int32_t;
typedef unsigned uint32_t;

現在のマシンに適した実際のタイプを選択します。

実際には、追加の補助ヘッダー ファイルと補助プリプロセッサ マクロが多数あるため、それよりもはるかに複雑になることがよくありますが、効果は同じuint32_tですtypedef

「あなたのコンパイラが C99 互換であるなら、マッピング機能が必要ですか?」と尋ねたところ、答えは基本的に「はい」です。のコピーstdint.h。(あなたの他の質問に答えるために、はい、少なくとも<stdint.h>コンパイラと同じ数のコピーがあります.1つのマスターコピーなどはありません。)

一方的なコメント。「コードの移植性を高め、整数サイズの制限を回避するには、C 標準の整数ヘッダーを使用することをお勧めします」とおっしゃいました。実際の推奨事項は、正確なタイプのサイズなど、特別な要件がある場合にそのヘッダーを使用することです。何らかの理由で、たとえば正確に 32 ビットの符号付きタイプが必要な場合は、必ずint32_tfromを使用してstdint.hください。intしかし、ほとんどの場合、「プレーンな」タイプが好きでlong、完全に問題ないことがわかります。宣言する変数ごとに正確なサイズを選択し、型名 fro を使用して宣言する必要があると誰にも言わせないでくださいstdint.h

于 2016-11-05T14:40:50.433 に答える
2

#ifさまざまなアーキテクチャの処理は、やなどの条件付き前処理ディレクティブによって実装される可能性が最も高い#ifdefです。たとえば、GNU/Linux プラットフォームでは次のようになります。

# if __WORDSIZE == 64
typedef long int        int64_t;
# else
__extension__
typedef long long int       int64_t;
# endif
于 2016-11-05T14:45:05.160 に答える
0

「マッピング」または「変換」の形で起こる魔法はありません。単にステートメントstdint.hのリストが含まれているだけです。typedef違いは、コンパイラのフロント エンドではなく、コード ジェネレータにあります。

8 ビット ターゲットの場合、コード ジェネレーターは、ネイティブにサポートされている型の算術演算にネイティブ命令を使用します (おそらく 16 ビットの add 命令があります)。残りについては、ライブラリ ルーチンへの呼び出しを挿入して、より大きなデータ型を実装します。

8 ビット コンパイラの RTL に "long_add"、"long_subtract" などのルーチンが含まれることは珍しくありません。

于 2016-11-05T14:41:21.797 に答える