-4

ここで尋ねられたいくつかの質問から型について理解したのは、C++ ではchar常に1バイトですが、ビット数はシステムごとに異なる可能性があるということです。

sizeof()演算子はchar単位として使用するため、sizeof(char)常にC++ のバイト単位です (ローカル マシンのアドレスの最小単位の1ビット数を取ります) RAM 内の変数の場合、ファイルに書き込まれるデータの最小単位としての変数のサイズは、RAM から読み取られる値のサイズである必要があり、ファイルからの読み取りの場合はその逆になります。次に、次のようなことを試みた場合、データがビット単位で書き込まれない可能性があると言えますか。fstream()88

ofstream file;
file.open("blabla.bin",ios::out|ios::binary);
char a[]="asdfghjkkll";
file.seekp(0);
file.write((char*)a,sizeof(a)-1);
file.close();

常にchar既存の標準8ビットのバイト単位で使用される場合を除き、データのヒープが 16 ビット マシンでファイルに書き込まれ、32 ビット マシンで読み取られるとどうなりますか? または、OS 依存のテキスト モードを使用する必要がありますか? そうでなければ、私は真実とは何かを誤解していますか?


編集:間違いを修正しました。
警告してくれてありがとう。


Edit2:私のシステムは64ビットですが、charタイプのビット数を取得します。何が問題なの8ですか? 8falseの結果を取得する方法はありますか? 変数をビットごとの演算子で可能なサイズを超え00000...てシフトすることで を取得しました。変数のすべてのビットがゼロであることを保証した後、それを反転することで を取得しました。そしてそれがゼロになるまでシフトします。シフトするとゼロになるので、下で終了するループのインデックスからビット数を取得できます。char111...its size time

char zero,test;
zero<<=64; //hoping that system is not more than 64 bit(most likely)
test=~zero; //we have a 111...
int i;
for(i=0; test!=zero; i++)
 test=test<<1;

iループ後の変数の値はビット数型です。charこれによると、結果は となり8ます。私の最後の質問は次のとおりです。コンピューターがファイルストリームchar内のポインターをアドレス指定する方法が、少なくともビットである標準タイプと異なるため、ファイルシステムのバイトとタイプは異なるデータタイプですか? では、バックグラウンドで何が起こっているのでしょうか。 Edit3:なぜこれらのマイナス? 私の間違いは何ですか?質問は十分に明確ではありませんか?私の質問はばかげているかもしれませんが、私の質問に関連する回答がないのはなぜですか?char8

4

1 に答える 1

2

言語標準は、ファイルシステムが何をするかを実際に指定することはできません。言語がそれと対話する方法を指定することしかできません。C および C++ 標準も、相互運用性や異なる実装間の通信とは何の関係もありません。つまり、この質問に対する一般的な答えは、次のように言う以外にはありません。

  • システムの大多数は8ビットバイトを使用します
  • C および C++ 標準でcharは、少なくとも 8 ビットが必要です。
  • 8 ビット以上のシステムには、何らかの方法で 8 ビット ファイルを利用する (または少なくともトランスコードする) メカニズムが備わっている可能性が非常に高いです。
于 2013-07-17T17:39:31.693 に答える