2017-12-28 69 views
0

ほとんどの標準システムでは、charのサイズは8ビットです。シャノンの式を用いて:文字のサイズが8ビットしかないのはなぜですか?

8ビット= log2N

Nが、しかし256

に等しくなければならないユニコードテーブルに256のを超える文字がはるかにあります。そして、私は次のコード行を実行し、私のコンパイラ、上:

char c = static_cast<char> (257); 

cout << c; 

私は、画面に印刷された未知の文字が、それでも文字を参照してください。

しかし、私は、ファイル内の多くの文字を入れていくつかのテストを実行した、およびファイルのサイズは、char = 8ビットの比に対応します。

charは8ビット(私のシステムでは少なくとも)のようですが、257以上の画面に何かが印刷されているのを見ているだけでなく、256より多くの文字が表示されていますユニコードテーブル。

+0

'char'は(Unicodeの意味で)文字ではなく、「バイト」つまり基本的にアドレス可能なものです。 –

+0

CとC++が1970年代に最初に設計されたとき、Unicodeを使用できなかったのは、それが存在しなかったからです。 –

+0

"ファイルにたくさんの文字を入れる"というのは、もちろん意味があるバイト(オクテット)を意味します。しかし、テキストを意味する場合は、1文字あたり1バイトのサンプル・テキストをすべてエンコードする可能性のある特定の文字エンコードを選択している(またはサポートされていない文字を1バイトでエンコードする文字に置き換える)。 C++では、 'char'はテキストを意味しません。たとえば、あなたの257はテキスト文字として意図されていないようです。 –

答えて

4

charC++標準で1バイトであることが保証されます。 byte = 8 bitsというステートメントがすべてのシステムに適用されるわけではないので、サイズが8ビットであることを示すものではありません。説明のために、約8ビットのバイトだけを話すと仮定します。あなたが書くすべての

まず、:

8 bits = log2Nので、N must equal 256

あなたが正しいです。 8ビットは256までの異なる値を表すことができ、Unicodeがそれ以上の文字で構成されているという事実は、この問題とは何の関係もありません。 charは、可能性のあるすべての文字を表すことを意図していません。 some range of printable or non printable charactersに解釈することができる256の異なる値の1つを表すことを意味します。

ただし、Unicodeテーブルには256文字を超えています。そして、私は次のコード行を実行し、私のコンパイラ、上:

char c = static_cast<char> (257); 
cout << c; 

私は、画面に印刷された未知の文字が、それでも文字を参照してください。

しかし、実際にはstatic_cast<char>(257)は何を返すのですか?

char c = static_cast<char>(257); 
std::cout << static_cast<int>(c); 

1が印刷されます、そして我々は、Unicode(またはASCII)テーブルに飛び込むよう、私たちは、この値はStart of Heading文字を表していることがわかります。これは印刷できない文字であり、結果として、定義されていない文字がコンソールに表示されます(は本当に定義されていないかどうかの確認が必要です)。それに対応して

文字の広い範囲を印刷するために、(従って、それは65536個の値の範囲をカバーすることができ、16ビットである可能性が最も高いである)wchar_tを用いて検討しstd::wstring

0

それは本当にあなたが使用しているアルゴリズムをコーディングの種類に依存します。 ASCIIとしては、charは歴史的な理由のために8ビットである0〜255のみ

+0

ASCII文字の値の範囲は0〜127です。 128から255までの値は、さまざまな拡張ASCIIエンコーディングによって使用されます。特に、[ISO 8859](https://en.m.wikipedia.org/wiki/ISO/IEC_8859)では、さまざまな方法で範囲の上半分を使用する12種類の異なるエンコーディングを定義しています。 –

1

あります。 Cプログラミングが開発されたとき、ほとんどの出力はダム端末上にありました。ダム端末は、ASCII文字エンコーディングに基づいて文字を表示しました。 ASCII文字は0〜255の範囲でした。これは英語で印刷可能な文字のほとんどを処理しました。 すべての言語を考慮すると、256文字を超える文字があります。追加の文字エンコーディングが開発されました。 Unicodeは1つで、UTF-8は別のものです。

+0

ASCIIの範囲は0〜127です。Unicodeは_文字セットです; _ UTF-8はUTF-16と同様Unicodeの_文字エンコーディングです。 UTF-16は時にはUnicodeと呼ばれることもあります... UCS-2 ... 26年前、Unicodeは少しシンプルでした。 –

1

charが常に8ビットのサイズである必要はありません。 charはlimits.hで定義されたCHAR_BIT変数に依存します。ほとんどのシステムでは通常CHAR_BITの値は8ですが、実際の値は特定のシステムとライブラリの実装に依存します。 limit.hヘッダファイルhereの詳細については、こちらをご覧ください。

1

2つのこと:

  • あなたが実行している場合:

    char c = static_cast<char> (257); 
    cout << static_cast<int> (c); 
    

    最も可能性の高いケースであなたが1が表示されます。理由は実際にはcharは8ビット長で257は範囲外です。実際にはchar cは257を格納していませんが、1を返します。

  • 文字列を保存する方法は、表示方法には影響しません。これは、コンソールの文字エンコーディングによって異なります。

+0

正確には、問題は整数型間の**変換**です。 –

関連する問題