ページ 11

シフトJISの判別

Posted: 2010年7月22日(木) 17:45
by dom
 アルファベットと日本語が混ざった文字列の文字数を数えるために,次のようにしたところ
うまくいきませんでした。

char *str = "abcあいう";
int len = 0; //文字列の長さ

for( int i = 0; str != '\0'; i++ ){
if( str >= 0x81 && str <= 0x9f ){
i++;
}
len++;
}

そこで,いろいろ試した結果,
printf( "%x", str[3] );
の出力が,
ffffff82
となりました。
 私はstr[3]がif文で0x82と扱われると思っていたのですが,実際は0xffffff82となっていたようです。
そこで疑問なのですが,なぜ0xffffff82となるのでしょうか?

Re:シフトJISの判別

Posted: 2010年7月22日(木) 18:50
by たかぎ
charが符号付きだったのでしょう。

Re:シフトJISの判別

Posted: 2010年7月22日(木) 18:58
by ドラ
1.char型は汎整数拡張によって演算時にint型に変換されます。
この変換時には元の値を維持するように変換します。

2.C言語ではchar型が「符号付き」なのか「符号なし」なのかは処理系定義となっています。


char型が「符号付き」の環境ではstr[3]が負値になります。
その負値がint型に変換された結果、(2の補数を採用した処理系では)0xffffff82になってしまうのです。
#符号拡張と言うらしい。

これを回避するには、strをunsigned charに変換してから使えばいいと思います。

Re:シフトJISの判別

Posted: 2010年7月22日(木) 19:59
by dom
>ドラさん

汎整数拡張なる変換がされていたとは知りませんでした。
おかげで納得できました。ありがとうございます。