作者: うぇいく
日時: 2008/12/25(10:29)
 こんにちは。

>え〜と、素人の考えかもしれませんが、これってひょっとして、せっかく
>32ビットのアドレス空間を使えるのに、昔のコンパイラの制限であった
>16ビット分の範囲内に制限して計算しているよ、ってことになりませんか?
>
>もし、この理解で良いのならば、「0x8000」を「0x80000000」に
>置換しちゃうのがホントの32ビット化だろ、ヲイ。
>ということになるんじゃないかと思うんですが、その理解でおけ?

 長さではなく取出しているデータと比較してますから、おそらくは、
まったくの見当違いかと思います。
 どうも、検索していゆくなかでマーカーとして使用しているようです。
そのため、読み込みの時に強制的に0x8000のbitをオフにして、表示の
際には2バイト文字なら強制的に0x8000のbitをオンにしています。
# 3バイト文字とか、4バイト文字とかがない限りはこのままでよいはず。
# もし、2バイトとを超える文字があるなら、Bufの型(ungined ing)から
# 修正が必要です。


>char と signed char と unsigned char の型の違い(説明読んだけど、
>よくわからんかった。計算以外では違いはなさそうですが…)があるから
>そのままにしておくのが無難、という落ち?

 charは、singedかunsignedのいずれかを省略しているだけです。
で、どちらを省略しているかというと、コンパイル時のオプションに
依存します。
# デフォルトではsingedのはず。
で、singedとunsignedの差は・・・名前の通りです。8bits変数を符号付きで
-128から127とするか、符号無しで0から255とするか です。日本語を扱う
場合、unsingedのほうが便利なんですが、標準ライブラリの文字列系の
関数と型が一致すなくなるため、適時使い分けたりします。
# singedなchar型の変数(配列)と、buffer[i]>=0x80とゆー判定をしてしまう
# 失敗が結構ありがちです(利口なコンパイラは警告をだしてくれます)