#pragma twice

KAB-studio > プログラミング > #pragma twice > 224 Version 12.01 文字列じゃない世界

#pragma twice 224 Version 12.01 文字列じゃない世界

前のページへ 表紙・目次へ 次のページへ

 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 数字と文字列の変換 >
につづく!
まずはいろんな答を憶えろってわけね
それから、自分の答を見つけるわけ
それが一番難しそう……
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。