シフトJISの判別

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dom

シフトJISの判別

#1

投稿記事 by dom » 15年前

 アルファベットと日本語が混ざった文字列の文字数を数えるために,次のようにしたところ
うまくいきませんでした。

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の判別

#2

投稿記事 by たかぎ » 15年前

charが符号付きだったのでしょう。

ドラ

Re:シフトJISの判別

#3

投稿記事 by ドラ » 15年前

1.char型は汎整数拡張によって演算時にint型に変換されます。
この変換時には元の値を維持するように変換します。

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


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

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

dom

Re:シフトJISの判別

#4

投稿記事 by dom » 15年前

>ドラさん

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

閉鎖

“C言語何でも質問掲示板” へ戻る