コンピュータプログラムの思考論理(8)-charの本当の意味

2708 ワード

简単に见えるchar
前の2つのセクションを通じて、私たちは文字とテキストの符号化と乱符号化に対して明確な認識を持つべきですが、前の2つのセクションはプログラミング言語とは関係なく、私たちはまだプログラムの中で文字とテキストをどのように処理するか分かりません.
このセクションでは、Javaで文字処理を行う基礎となるcharについて説明します.JavaではCharacter、String、StringBuffer、StringBuilderなどのクラスがテキスト処理を行います.これらの基礎はcharです.後述する記事では、これらのクラスについて説明します.
charは簡単に見えますが、第2節で述べたように、charは1つの文字を表すために使用されます.この文字は中国語の文字でも英語の文字でも構いません.値を割り当てるときは、定数文字を単一引用符で囲みます.たとえば、次のようにします.
char c = 'A';
char z = ' ';

しかし、3節では、文字タイプも算術演算と比較ができるのはなぜですか.charの本質はいったい何なのか.
charの本質
Java内部での文字処理にはUnicodeが用いられ,具体的な符号化形式はUTF-16 BEである.簡単に振り返ると、UTF-16は2バイトまたは4バイトで1文字を表し、Unicode番号範囲が65536以内のものは2バイト、範囲外のものは4バイト、BE(Big Endian)は上位バイトを先に出力し、下位バイトを出力し、整数の内蔵表現と一致する.
charは本質的に2バイトを固定的に占有する符号なし正の整数であり、この正の整数はUnicode番号に対応し、そのUnicode番号に対応する文字を表すために使用される.
固定で2バイトを占有するため、charはUnicode番号が65536以内の文字しか表示できず、範囲外の文字は表示できません.
では、範囲外の文字はどのように表示されますか?2つのcharを使用します.クラスStringにはいくつかの方法がありますが、後述します.
この認識に基づいて、charのいくつかの行為を見てみると、理解しやすいです.
charの付与
charにはいくつかの付与方法があります.
  • char c = 'A'
  • char c='馬'
  • char c = 39532
  • char c = 0x9a6c
  • char c = '\u9a6c'

  • 第1の付与方式は最も一般的であり、Asciiコードで表される文字を文字変数に付与する.
    2つ目もよくありますが、ここでは中国語の文字です.文字定数を直接書くときはファイルの符号化に注意しなければなりません.例えば、GBK符号化のコードファイルはUTF-8で開き、文字が文字化けしてしまいます.値を付けるときは現在の符号解読方式で、この文字形式に対応するUnicode番号値を変数に割り当てます.「馬」に対応するUnicode番号は39532なので、2番目の付与値は3番目の付与値と同じです.
    3つ目は直接10進数の定数を文字に割り当て、4つ目は16進数の定数を文字に割り当て、5つ目はUnicode文字形式で与えます.
    以上、2,3,4,5はすべて同じで、本質はすべてUnicode番号39532を文字に割り当てたものです.
    charの演算
    charは本質的に整数であるため、整数で可能ないくつかの演算を行うことができ、演算を行う際にintと見なされるが、charが2バイトを占めるため、演算結果はcharタイプに直接付与できず、強制タイプ変換が必要であり、byte、shortが整数演算に関与することと類似している.
    charタイプの比較はそのUnicode番号の比較である.
    charの加減算はUnicode番号で演算され、一般的には文字を加減算する意味はありませんが、Asciiコード文字には意味があります.例えば大文字と小文字の変換では、大文字A-Zの番号は65-90、小文字a-zの番号は97-122で、ちょうど32の差があるので、大文字と小文字は32を加えるだけで、小文字は32を減らすだけです.加減演算のもう一つの応用は暗号化と復号化であり、文字を何らかの可逆的な数学演算で復号化することができる.
    charのビット演算は整数に対応するビット演算と見なすことができるが,符号なし数,すなわち,符号付き右シフト>>と符号なし右シフト>>の結果は同じである. 
    charのバイナリ
    charが本質的に整数である以上、charのバイナリ表現を表示するには、次のようにIntegerの方法を使用することができます.
    char c = ' ';
    System.out.println(Integer.toBinaryString(c));

    出力は1001101001101100
    小結
    この節ではcharの本質を紹介します.それは固定的に2バイトを占有しています.実際には整数で、文字のUnicode番号を表しています.65536番号内の文字ではありません.1つのcharでは表しません.2つのcharが必要です.
    私たちは以前のすべての章を振り返って、考えを整理します.
    プログラムとは、主にコンピュータがどのデータに対してどのような操作を行うかを教えることです.1節では変数でデータを定義する方法を紹介し,2節ではデータの最初の操作−賦値,3節ではデータの基本演算,4節から本節ではデータのバイナリ表現およびビット演算を紹介した.
    これで、基本データ型を定義し、基本データを基本演算することができますが、実際の操作では演算自体だけではありません.「もし」/「じゃあ」のような論理を表すメカニズム、すなわち、状況に応じて実行を選択するメカニズム、すなわちプロセス制御が必要です.