3

fwriteは移植可能ですか?以下に説明する問題に実際に直面しているわけではありませんが、Cの基本を理解したいと思います。

2台のマシンA8(バイト= 8ビット)とB16(バイト= 16ビット)があると仮定しないでください。

次のコードは、両方のマシンで同じ出力を生成しますか?

unsigned char[10] chars;
...
fwrite(chars,sizeof(unsigned char),10,mystream);

A8は80ビット(10オクテット)を生成し、B16は160ビット(20オクテット)を生成すると思います。私が間違っている?

ビット単位の長さはバイトのサイズに依存しないため、uintN_tタイプのみが使用された場合、この問題は発生しません。しかし、おそらくuint8_tはB16には存在しません。

この問題の解決策は何ですか?

uint32_tの配列を作成し、この配列にバイトを入れて(マシンのアーキテクチャに応じてスマートシフトとマスクを使用して)、この配列を作成することで問題が解決すると思います。しかし、これは実際には満足のいくものではありません。uint32_tがすべてのプラットフォームに存在するという仮定があります。この配列の充填は、現在のマシンのアーキテクチャに大きく依存します。

ご回答ありがとうございます。

4

3 に答える 3

2

fwrite() は標準ライブラリ関数です。そのため、C コンパイラごとに移植可能でなければなりません。つまり、マシンをサポートするには、そのコンパイラの C 標準ライブラリで定義する必要があります。

したがって、8bit、16bit、32bit のマシンは、同じ高レベルの操作を提供します。

しかし、これらのライブラリ関数を設計したい場合は、マシン アーキテクチャ、そのマシンのメモリ構成を考慮する必要があります。

C コンパイラのユーザーとして、内部動作について気にする必要はありません。

それらのCライブラリ関数を使いたいだけだと思います。したがって、異なるマシンの関数の動作に違いはありません。

于 2012-07-27T10:38:11.293 に答える
0

1 バイトは、ほとんどすべての最新のコンピューターで 8 ビットです。fwriteしかし、移植性がない別の理由があり
ます。リトル エンディアン マシンで書き込まれたファイルは、ビッグ エンディアン マシンやその他の方法では読み取ることができません。

于 2012-07-27T09:53:40.297 に答える
0

C では、char は「マシンのアドレス可能な最小単位」として定義されます。つまり、char は必ずしも 8 ビットである必要はありません。

ほとんどの場合、char が 8 ビットであるという事実に頼るのが安全であり、いくつかの極端なケースに対処する必要はありません。

一般的に言えば、ストレージ上のファイルに「半分のバイト」を書き込むことはおそらくできないでしょう。さらに、異なるバイト サイズのマシンで動作するように設計されたデバイス間のハードウェア レベルでの移植性に問題があります。他のデバイス (テレコムなど) を扱っている場合は、ビット ストリームを実装する必要があります。

于 2012-07-27T10:09:00.670 に答える