キャストの落とし穴

VC++である。

char ch = 0xff;
int n = ch;

当然nに0xffが入ると思ってしまいますが……
意外なことに結果は0xffffffffです。
ちゃんと理解している人なら意外でも何でもないでしょう。
char型で0xffは-1を表し、int型で-1は0xffffffffだからです。


私は最後の最後まで気付きませんでしたが。


心の声「なんでffで埋めるんだよ?普通に考えたら0で埋めるだろっ!どんな仕様だよっ!いやまてよ、デバッグモードで実行してるからメモリがffで初期化されてるのかな?だとすると、キャストってのは値として変換するんじゃなくてメモリから読み取る長さをごまかすだけなのかな?」
こんな感じで。


ちなみにunsigned int型にキャストしても0xffffffffになります。
これは、符号付きから符号なしへのキャストだから何が起こってもしょうがないですね(こんな理解でいいのか?)。
ヘルプによると、char->int->unsigned intの順でキャストされるようです。ということで-100をunsigned intにキャストすると4294967196になります。


さて、最初のコードですがunsigned charを使えばうまくいきます。
というか環境によってはchar型はデフォルトで符号なし?