アルファベットと日本語が混ざった文字列の文字数を数えるために,次のようにしたところ
うまくいきませんでした。
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となるのでしょうか?
シフトJISの判別
Re:シフトJISの判別
1.char型は汎整数拡張によって演算時にint型に変換されます。
この変換時には元の値を維持するように変換します。
2.C言語ではchar型が「符号付き」なのか「符号なし」なのかは処理系定義となっています。
char型が「符号付き」の環境ではstr[3]が負値になります。
その負値がint型に変換された結果、(2の補数を採用した処理系では)0xffffff82になってしまうのです。
#符号拡張と言うらしい。
これを回避するには、strをunsigned charに変換してから使えばいいと思います。
この変換時には元の値を維持するように変換します。
2.C言語ではchar型が「符号付き」なのか「符号なし」なのかは処理系定義となっています。
char型が「符号付き」の環境ではstr[3]が負値になります。
その負値がint型に変換された結果、(2の補数を採用した処理系では)0xffffff82になってしまうのです。
#符号拡張と言うらしい。
これを回避するには、strをunsigned charに変換してから使えばいいと思います。