Version 12.01
文字列じゃない世界
「前回までは文字列に関して見てみたけど、今回からは文字列じゃないもの
について見てみます」
『文字列じゃないものってゆーと、 int とかそういうのってこと?』
「そういう感じ。ただ、実はこの辺はすごく曖昧だったり複雑だったりする
から、最初にその辺をはっきりしておきます」
『はーい』
「まず、 Version 4.04 ( No.054 ) からの2進数やビット関係の話を思い
出して」
『パソコンの世界は全部ビットで表されてるって話だよね』
「そう。ビットの組み合わせで数字とかも表されてるわけ。たとえば int
の変数に 0x00000001 が入ってたら 1 とか」
『あと符号とかのビットとか色々あるものね』
「そうそう。そして、その数字で文字も表すことができる、ってことを
Version 11.01 ( No.201 ) とかで説明しました」
『 A が 0x41 とかね』
「この 0x41 を10進数で表すと 65 になる、ってことをふまえて、 int
と char を比較してみます」
int に 0x41 が入ってると 65 という数になる。
char に 0x41 が入ってると 'A' という文字になる。
「ってことが言えます」
『え? でもさ、 char は数字としても使えるんだから』
char に 0x41 が入ってると 'A' という文字にも 65 という数にもなる。
『っていう方が正しいんじゃない?』
「そう! ポイントはそこ。 char に 0x41 が入ってたとき、それを 'A'
って文字とみなすこともできれば、 65 って数とみなすこともできます」
『みなし、ね』
「そう。逆に、 int に 0x41 が入ってたときに、この中に 'A' が入って
る、ってみなすこともできるんです」
void OutputIntChar()
{
int i = 0x41;
TRACE( "%c\n", (char)i );
// A
}
『お、キャストしたら A ってなるんだ』
「つまり、メモリ上のビットが 0x41 ってあったら、数字の 65 ってみなす
ことも、文字の 'A' ってみなすこともできるってこと」
『元が同じでも見方を変えると違ってくるわけね』
「そう考えると、文字列のデータ、文字列じゃないデータ、っていうのは明
確な分け方がないんです」
『見方によってそうだったりそうじゃなかったりするから?』
「そう。たとえば Version 11.06( No.206 ) でやった文字コードの話」
『そか、文字コードが違うってことは、それも見方が違うから』
「文字コードが合っていれば文字列のデータだって判るけど、違ってれば全
然関係ないデータって見えるわけ」
『なるほどね』
「で、今回から見ていくのは、そういう見方見え方の話」
『どういう見方をするとこう見える、みたいな?』
「そんな感じ。たとえば、 int の場合、文字にも数字にも見えるわけで
しょ」
『うん、さっきやったね』
「でもそれは見える、ってだけの話。 int の中に 0x00000041 が入ってい
たとします」
『数字の 65 だね』
「それを文字列の "65" に変えるときにはどうするか」
『むむむ?』
「 0x00000041 は数字の 65 ってみなせるけど、それはそうみなせるだけ。
文字列の "65" は、文字コードだと 0x36 0x35 になるから」
『つまり 0x00000041 を 0x36 0x35 に変換しなきゃいけない』
「そういうこと。こういう、見えてるだけじゃなくて、実際にそういう形に
変える方法、っていうのをこれから教えていきます」
『はーい』
「それともうひとつ、文字列とはみなさないデータについて色々と説明しま
す」
『ん? どゆこと?』
「たとえば int 。 int を数字としてみなす方法は教えたよね」
『 Version 4.04 ( No.054 ) でやったね。 int ってゆーより、2進数とか
16進数の計算方法だったけど』
「その計算方法も、ルールを知らなきゃ計算できないでしょ」
『そーゆールールを教えてもらう?』
「ルールもいっぱいあるし、それで気を付けなきゃいけないこともたくさん
あるから」
『む、 CString みたいに、知らないとまずいのとか?』
「あるよ、結構。たとえば、小数点を含む計算とか」
void Double01()
{
TRACE( "%.20f\n", 0.1 );
// 0.10000000000000001000
}
『 0.1 を出力してるだけ……あれ? なんか変なとこに 1 が入ってる
よ?』
「そう。実は、コンピューターの世界では 0.1 は厳密には 0.1 じゃないん
です」
『どどど、どういうこと???』
「詳しくは今度説明するけど、簡単に言うと、小数点以下は int の時と違
う方法表してるから」
『違う方法?』
「 0 は 0 、 1 は 1 、 2 は 10 、 3 は 11 、とかみたいに1対1になら
ないってこと」
『???』
「ま、まぁこれはかなり面倒だからあとでちゃんとってことで」
『なんかちょっと怖い……』
「他には、構造体の話も」
『構造体って、クラスみたいなのでメンバ関数がないのだよね』
「 Version 8.13 ( No.155 ) とかでやったね。その構造体にはちょっと特
殊な性質があるんです。次のような普通の構造体」
struct TEST_STRUCT
{
char m_ch;
int m_i;
};
「この構造体のサイズは?」
『 char が 1 バイトで、 int が 4 バイトだから、 5 バイトだね』
「ところが!」
void SizeOf_TEST_STRUCT()
{
TRACE( "%d\n", sizeof( TEST_STRUCT ) );
// 8
}
『えっ!? 8 ?? なんで!?』
「っていう性質があるんです」
『げ、そっか、これも答は今度ってことなんだ』
「そういうこと」
『なんかストレスたまる……』
「最後に、ファイル関係について見てみるつもり」
『ファイル?』
「文字コードの問題を例に挙げると、普段使っている Shift-JIS や、標準
で使える Unicode の文字コードとは違う文字コードを普通に使うことはあ
まりありません」
『どゆこと?』
「たとえば JIS とか EUC って文字コードでも、読み込んだら Shift-JIS
や Unicode に変換してから操作します」
『 JIS とか EUC のまま操作はしないってこと?』
「だって、ランタイムとか API は JIS や EUC には対応してないから」
『そっか、そういうのを使うためには Shift-JIS とかに変えておかないと
いけないんだね』
「だから、他の文字コードを使うとき、っていうのはたいがいファイル操作
と関係してくるんです」
『ネットワークとかは?』
「……関係してくるけど、難しいからも少しあとで」
『やっぱ関係するんだ』
「ま、結局は他の種類のコンピューターのファイルを使う機会があれば、そ
れは文字コードを気にする必要がある、ってところかな」
『文字コード以外のは?』
「それも重要。さっきの構造体のとか」
『あのサイズの話ね』
「あれなんて、同じ Visual C++ で作ったファイルでも、問題が出てくる場
合があるから」
『げ、そうなの?』
「さっきのサイズの話、あのときは 8 だったけど、設定を変えると 5 にも
なるから」
『げげ!』
「そういう複雑な部分がいっぱいあるから、それをひとつひとつ解決してい
こうね」
『はーい』
「う”、乗り気でないね」
『ちょっとめんどそう……』
「まぁね、この辺は苦手な人多いし、難しく考えず、こつこつとやった方が
いいかも」
『苦手な人多いんだ……』
「最後に、最初の話題のまとめ」
『最初の話題?』
「文字列かそうじゃないか、っていう話」
『あー』
「基本的には見方の問題なんだけど、それでも、文字列として判断できるも
のを【テキスト】、判断できないものを【バイナリー】って言います」
『バイナリーって、前に聞いた』
「 Version 1.0 ( No.003 ) で【バイナリーモード】ってやったでしょ」
『あ、そーか、ファイルを16進で見るってやつだ。……そっか、つまりそ
れって文字列として見ない、ってこと?』
「そういうこと! バイナリーモードは、開いたファイルを16進で表示し
ます。その16進の数字が文字列として表示できるとしても」
『 0x41 だとしても、 A じゃなく 0x41 で表示する、ってことね』
「そういうこと。まぁ右端に、変換できたときには文字列が書いてあるし」
『あ、ホントだ』
「こういうふうに本来は見方の問題なんだけど、逆に、テキストモードで開
いて、文字列になっていたら、そのファイルを【テキストファイル】って言
います。そうじゃないファイルを【バイナリーファイル】って言います」
『???』
「まぁ簡単に言って、エディタで開いて文字列が表示されたらテキストファ
イル、意味不明だったらバイナリーファイル、ってことかな」
『でもそれじゃ文字化けとかもバイナリーファイルってことにならない?』
「そこが微妙なところだね。だから、この辺は曖昧かも。でもこういう部分
で結構問題が出てくるから、その辺をどうプログラム上でクリアするか」
『それをこれから勉強するわけね』
「そゆこと」
/*
Preview Next Story!
*/
『なんかなぞなぞの答なしって感じ』
「でも実際、そんなもんだよ」
『え?』
「答がなかったり、誰かが勝手に作った物だったり」
『だからあたしも考えなきゃいけないわけね』
「ま、それでも現状の【答】は知っておいた方がいいかな」
『というわけで次回』
< Version 12.02 数字と文字列の変換 >
「につづく!」
『まずはいろんな答を憶えろってわけね』
「それから、自分の答を見つけるわけ」
『それが一番難しそう……』