組み込みC/C++

C/C++リテラシー向上のためのページ

バイナリとテキスト①

バイナリとテキストが同列、もしくは反対語のような関係にあるものと誤解する場合が見られますが、テキストはバイナリのサブセットであり、バイナリはテキストのスーパーセットです。

 

テキスト ⊂ バイナリ(テキストはバイナリの部分集合)

 

この辺の曖昧さがchar型の使い方に現れがちです。

 

char foo = 130;

 

といったようなchar型の使い方をする人がいますがこれは間違いです、バグを引き起こしますので直しましょう。char型をunsignedと勘違いしがちなんですが、char型がsigned か unsignedかは処理系依存です。という事は 処理系によってはchar型の範囲が -128 ~ +127 、0 ~ + 255  となり、たとえば例のfoo が -126(130を2進で表して2の補数にマイナスをつける) となる処理系と130となる処理系が現れます。char型のままバイナリデータを扱ってCheckSum計算などすると処理系によって答えが変わってきてしまいます。バイナリデータとして扱う場合はちゃんとunsigned char とする必要があります。逆に

 

unsigned char bar[] = "abc";

 

とする人も多くあります。これはバグになることはありません。(バグになるような事例は見たことありません。) ただしテキストを扱う場合はchar型を使うのを推奨します。(標準関数ではテキストをchar型で扱っており、unsignedでテキストを扱う場合余計なキャストをつける必要が出てきます。)

 

まとめると

unsigned char 型 はバイナリを扱う テキストも扱える(非推奨)

char 型 はテキストを扱う

 

となり最初の

 

テキスト ⊂ バイナリ(テキストはバイナリの部分集合)

 

の関係が見えてくると思います。