JavaA2Z

KAB-studio > プログラミング > JavaA2Z > charとは

char

日本語 文字
英語 char
ふりがな きゃら、きゃらくた、ちゃー
フリガナ キャラ、キャラクタ、チャー

解説

プリミティブ型のひとつ。
 
文字を格納するための
ラッパークラスCharacterクラス
 
char宣言された変数は、16ビット(2バイト)分のメモリ領域を使用する。
左端のビットも含めた8ビットを使用して、0~65535の整数値を格納することができる。
だが、char変数の本来の目的は、文字を格納するためにある。char変数には通常「Unicodeの一文字を表す整数値」を格納する。

サイズとしてはshortと同じ16ビットだが、shortと異なり「文字を表す整数値」を格納するために使用する。
そのため他の整数と異なり、符号なし整数であり、正の値のみ格納できる。
これは、格納している整数値が単なる「Unicodeの一文字を表す整数値」であり、負の値に意味がないためである。他の整数は左端のビット符号に使用しているが、char変数は左端のビットも含め16ビット全体で「正の整数のみ格納する」ようにしている。
これにより、char変数同士の比較は「正の整数同士の比較」となる。

格納される値は「Unicodeの一文字を表す整数値」である。Unicodeは2バイトのため、この2バイトの値が格納されることになる。また、他の文字コード文字を格納することは基本的にない。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // char型の変数を宣言します。
        char ch;
        // メモリ上に16ビットの領域が確保されました。

        // ここに文字'あ'を格納します。
        ch = 'あ';
        // それを出力します。
        System.out.println( ch );
        // あ

        // char型は、実際は整数値を格納する2バイトサイズ
        // の型です。
        short sh = (short)ch;
        System.out.println( Integer.toHexString( sh ) );
        // 3042
        // 「あ」は実際には0x3042という整数値で、それが
        // char型変数に格納されているということです。

        // char型変数に格納された「あ」がどのように
        // ビットとして格納されているか見てみます。
        outputCharBit( ch );
        // 0011000001000010

        // このように「あ」という文字、つまり
        // 0x3042というchar型整数は、
        // 「0011000001000010」という
        // 「0か1」を16個並べた形で格納されています。

        // char型変数は符号なし整数値型なので、負の値は
        // 普通は格納できません。
        // ※コンパイルエラーの例
        // char ch1 = -1;
        // ※エラーメッセージ
        // 型の不一致: int から char には変換できません
        // ※コンパイルエラーの例ここまで

        // キャストして無理矢理入れても、内部では符号なし
        // 整数値として扱われます。
        char ch1 = 1;
        char ch2 = (char)-1;
        System.out.println
            ( Integer.parseInt( Integer.toHexString( ch2 ), 16 ) );
        outputCharBit( ch2 );
        // 65535
        // 1111111111111111

        // つまり負の値は実際のビット値そのままに格納されます。
        // char型変数内のこれらの値は、左端のビットが符号として
        // 扱われず、16ビット全体で正の整数値を表現します。

        // なので、比較する際は正の整数値として比較します。
        if( ch1 < ch2 )
        {
            // ここに来ます。
            System.out.println( "1 < -1" );
        }
        else if( ch1 > ch2 )
        {
            System.out.println( "1 > -1" );
        }
        else
        {
            System.out.println( "1 == -1" );
        }
        // 1 < -1

        // このように「1 < -1」という結果になります。
        // 負の値を格納しても、char型変数同士の比較をする際に
        // 正の整数と見なして比較するため、実際には
        // 「1 < 65535」という比較をしているわけです。

        // 最大値と最小値はCharacterクラスのstaticフィールド
        // として宣言されています。
        ch = Character.MAX_VALUE;
        System.out.println( ch );
        System.out.println( Integer.toHexString( ch ) );
        System.out.println
            ( Integer.parseInt( Integer.toHexString( ch ), 16 ) );
        outputCharBit( ch );
        // 
        // ffff
        // 65535
        // 0111111111111111

        ch = Character.MIN_VALUE;
        System.out.println( ch );
        System.out.println( Integer.toHexString( ch ) );
        System.out.println
            ( Integer.parseInt( Integer.toHexString( ch ), 16 ) );
        outputCharBit( ch );
        // 
        // 0
        // 0
        // 0000000000000000

        // ただ、この例にあるように、最大値・最大値共に
        // 文字としては意味がありません。使うことは少ない
        // でしょう。
    }

    /**
     * char型変数の中身をビット形式で出力します。
     */
    private static void outputCharBit( char ch )
    {
        char flag = 1;
        StringBuffer strbuf = new StringBuffer();
        // 全ビットを右からチェックします。
        forint iF1 = 0; iF1 < 16; ++iF1 )
        {
            // 取得した順に出力すると逆順になるので、
            // 取得した値を頭に挿入していきます。
            if( ( ch & flag ) == 0 )
            {
                strbuf.insert( 0, "0" );
            }
            else
            {
                strbuf.insert( 0, "1" );
            }
            // 2倍することでビットシフトします。
            flag *= 2;
            // (<<演算子を使用するとint型にキャスト
            // されるので*演算子を使用しています)
        }
        System.out.println( strbuf );
    }
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // char型の変数を宣言します。
        char ch;
        // メモリ上に16ビットの領域が確保されました。

        // ここに文字'あ'を格納します。
        ch = 'あ';
        // それを出力します。
        System.out.println( ch );
        // あ

        // char型は、実際は整数値を格納する2バイトサイズ
        // の型です。
        short sh = (short)ch;
        System.out.println( Integer.toHexString( sh ) );
        // 3042
        // 「あ」は実際には0x3042という整数値で、それが
        // char型変数に格納されているということです。

        // char型変数に格納された「あ」がどのように
        // ビットとして格納されているか見てみます。
        outputCharBit( ch );
        // 0011000001000010

        // このように「あ」という文字、つまり
        // 0x3042というchar型整数は、
        // 「0011000001000010」という
        // 「0か1」を16個並べた形で格納されています。

        // char型変数は符号なし整数値型なので、負の値は
        // 普通は格納できません。
        // ※コンパイルエラーの例
        // char ch1 = -1;
        // ※エラーメッセージ
        // 型の不一致: int から char には変換できません
        // ※コンパイルエラーの例ここまで

        // キャストして無理矢理入れても、内部では符号なし
        // 整数値として扱われます。
        char ch1 = 1;
        char ch2 = (char)-1;
        System.out.println
            ( Integer.parseInt( Integer.toHexString( ch2 ), 16 ) );
        outputCharBit( ch2 );
        // 65535
        // 1111111111111111

        // つまり負の値は実際のビット値そのままに格納されます。
        // char型変数内のこれらの値は、左端のビットが符号として
        // 扱われず、16ビット全体で正の整数値を表現します。

        // なので、比較する際は正の整数値として比較します。
        if( ch1 < ch2 )
        {
            // ここに来ます。
            System.out.println( "1 < -1" );
        }
        else if( ch1 > ch2 )
        {
            System.out.println( "1 > -1" );
        }
        else
        {
            System.out.println( "1 == -1" );
        }
        // 1 < -1

        // このように「1 < -1」という結果になります。
        // 負の値を格納しても、char型変数同士の比較をする際に
        // 正の整数と見なして比較するため、実際には
        // 「1 < 65535」という比較をしているわけです。

        // 最大値と最小値はCharacterクラスのstaticフィールド
        // として宣言されています。
        ch = Character.MAX_VALUE;
        System.out.println( ch );
        System.out.println( Integer.toHexString( ch ) );
        System.out.println
            ( Integer.parseInt( Integer.toHexString( ch ), 16 ) );
        outputCharBit( ch );
        // 
        // ffff
        // 65535
        // 0111111111111111

        ch = Character.MIN_VALUE;
        System.out.println( ch );
        System.out.println( Integer.toHexString( ch ) );
        System.out.println
            ( Integer.parseInt( Integer.toHexString( ch ), 16 ) );
        outputCharBit( ch );
        // 
        // 0
        // 0
        // 0000000000000000

        // ただ、この例にあるように、最大値・最大値共に
        // 文字としては意味がありません。使うことは少ない
        // でしょう。
    }

    /**
     * char型変数の中身をビット形式で出力します。
     */
    private static void outputCharBit( char ch )
    {
        char flag = 1;
        StringBuffer strbuf = new StringBuffer();
        // 全ビットを右からチェックします。
        for( int iF1 = 0; iF1 < 16; ++iF1 )
        {
            // 取得した順に出力すると逆順になるので、
            // 取得した値を頭に挿入していきます。
            if( ( ch & flag ) == 0 )
            {
                strbuf.insert( 0, "0" );
            }
            else
            {
                strbuf.insert( 0, "1" );
            }
            // 2倍することでビットシフトします。
            flag *= 2;
            // (<<演算子を使用するとint型にキャスト
            // されるので*演算子を使用しています)
        }
        System.out.println( strbuf );
    }
}

この単語を含むページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2010/04/04
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。