Cでchar
1
バイトが長いのはなぜですか?なぜ2
バイトまたは4
バイト長ではないのですか?
1
バイトとして保持するための背後にある基本的なロジックは何ですか?私はJava a char
is 2
bytes long。で知っています。同じ質問です。
char
は標準でそのように指定されているため、C
では1バイトです。
最も可能性の高いロジックは次のとおりです。 char
(標準文字セット)の(バイナリ)表現は1
バイト。 C
が最初に開発されたとき、最も一般的に利用可能な標準は、それぞれ7ビットと8ビットのエンコーディングを必要とするASCII
とEBCDIC
でした。そう、 1
byte was文字セット全体を表すのに十分です。
OTOH、Java
が登場する間、拡張文字セットとunicode
の概念が存在しました。したがって、future-proofになり、拡張性をサポートするために、char
が2 bytes
、これは拡張文字セット値を処理できます。
char
が1バイトを超えるのはなぜですか? charは通常、ASCII文字を表します。ASCIIテーブルを見るだけで、(拡張)ASCIIコードなので、0〜255の数値を表すだけでよく、8ビット= 1バイトになります。
ASCIIテーブルを見てください。例:ここ: http://www.asciitable.com/
Java=が設計されたとき、彼らは将来、任意の文字(Unicodeも)が16ビット= 2バイトで保持されることで十分であると予想しました。
これは、C言語が37歳であり、128個のASCII文字しか使用されなかったため、1文字にそれ以上のバイトを含める必要がなかったためです( http:// en.wikipedia.org/wiki/ASCII )。
Cが開発されたとき(1971年にその最初の本が開発者によって発行されました)、2つの主要な文字エンコード標準はASCIIとEBCDICで、それぞれ文字の7ビットと8ビットのエンコードでした) 。また、当時はメモリとディスク領域の両方が大きな懸念事項でしたが、Cは16ビットのアドレス空間を備えたマシンで普及しており、文字列に1バイト以上を使用することは無駄であると考えられていました。
Javaが登場した(1990年代中頃)までに、ある言語では文字のエンコーディングに国際標準を利用できると認識できるようになり、その定義にUnicodeが選択されました。それまでは、メモリとディスク容量はそれほど問題ではありませんでした。
C言語標準は、すべてのオブジェクトが整数の抽象を占有する仮想マシンを定義しますストレージユニットいくつかの固定ビットで構成されています(limits.hの_CHAR_BIT
_マクロで指定)。各ストレージユニットは一意にアドレス可能でなければなりません。ストレージユニットは、基本文字セットの単一の文字が占めるストレージの量として定義されます。1。したがって、定義により、char
タイプのサイズは1です。
最終的に、これらの抽象ストレージユニットは物理ハードウェアにマッピングする必要があります。ほとんどの一般的なアーキテクチャは、個別にアドレス指定可能な8ビットバイトを使用するため、char
オブジェクトは通常、単一の8ビットバイトにマップされます。
通常。
これまで、ネイティブのバイトサイズは6〜9ビット幅でした。 Cでは、char
タイプは少なくとも 8ビット幅である必要があります。これは、基本文字セットのすべての文字を表すため、6ビットバイトのマシンをサポートするには、コンパイラはchar
オブジェクトを2つのネイティブマシンバイトにマップする必要がある場合があります。_CHAR_BIT
_は12です。sizeof (char)
はまだ1なので、サイズN
の型は_2 * N
_ネイティブバイトにマップします。
ASCIIテーブル全体(128文字)を表すのに1バイトを超える必要はありません。
ただし、intタイプ(4バイト)またはlong doubleタイプ(12バイト)など、データを格納する余地のある他のCタイプがあります。
これらのすべてに数値が含まれています(文字も含まれます。 "文字"として表されていても、 "数字"です。比較して追加できます...)。
これらは、長さがcmとmのように、異なる標準サイズです。