2011-01-11 21 views
2

以下のコードは、ASCIIコードを文字から抽出しています。 通常のASCII領域の文字を変換すると、私は期待した値を得ています。 拡張領域から£と€を変換すると、文字を格納しているINTに1のパディングの荷重が掛かります。C++でASCIIコードを見たときに予期しない結果が発生しました

以下の出力は次のようになります。

45(予想通りアスキーE) FFFFFF80(拡張ASCII€期待が、ものとパディングとして)

それは私の問題を引き起こしていないが、これはなぜ起こるか私は思ったんだけど。 コードは...

unsigned int asciichar[3]; 
    string cTextToEncode = "E€"; 
    for (unsigned int i = 0; i < cTextToEncode.length(); i++) 
    { 
     asciichar[i] = (unsigned int)cTextToEncode[i]; 
     cout << hex << asciichar[i] << "\n";  
    } 

誰でも説明できますか? ありがとう

+0

私は誤っている可能性がありますが、ユーロが拡張ASCII文字エンコーディングにあるとは思われません。http://www.asciitable.com/ –

+1

おそらくWindows 1252か8ビットISOエンコーディングのいずれかです。 –

+0

ASCII文字は 'unsigned int'sではありません。 http://en.wikipedia。org/wiki/ASCII – Johnsyweb

答えて

5

まずASCIIで行うには全く何の関係もありません、ASCIIを作成したときに、ユーロが存在していなかったので(延長またはその他)ASCIIには€はありません。しかし、いくつかのASCIIフレンドリーな8ビットエンコーディングは、文字をサポートしていますが、ソースコードエディタによって変換が行われます(コンパイラはエディタで€を表すバイトを見るだけですが、例えば、イスラエルのコンピュータ)。

第2に、(unsigned int)キャストは、文字のASCIIエンコーディングを抽出しません。それらは、基礎となる数字のchar型の値を符号なし整数に変換するだけです。コンパイル時に、変換された値が負の値になると、奇妙なことが起こります。がsigned charとなり、ASCII値が127より大きい文字は負の値になります。charの値です。

最初にunsigned charに、次にunsigned intに変換してください。

7

実装によっては、charは符号付きでも符号なしでもかまいません。あなたの場合は署名されているように見えるので、0x80は128ではなく-128と解釈されます。したがって、整数にキャストすると0xffffff80になります。

ところで、これは

+0

ちょうど不思議ですが、0x80は-128と解釈されますが、それは最上位ビットと何か関係ありますか? – BeeBand

+0

はい、MSBは符号付きcharの符号ビットです。 – harper

+1

はい、ハーパーはすでに言及したように、それは符号付き整数がほとんどのコンピュータで動作する方法ですが、MSBは符号ビットです(http://en.wikipedia.org/wiki/Twos_complementを参照)。 – wich

1

署名された値を昇格させるときは注意が必要です。

符号付きcharをsigned intに昇格すると、最初のビット(符号ビット)が考慮されます。 )24個のもので始まる進数)をintは(なり1...1-1X-XX-XX-XX(バイナリ) - - >0xFFFFFFYY(16進)

あなたがバイナリで 1X-XX-XX-XX(CHAR、Xを使用している場合)

1:アルゴリズムは、おおよそ次のようになりです

2)0X-XX-XX-XX(バイナリ)の場合は0...0-0X-XX-XX-XX(バイナリ) - >0x000000YY(16進数)です。

あなたの場合、ルール#2は常に強制的に実行します。これを行うには、最初のビット(符号ビット)を無視するようにコンパイラに指示する必要があります。このためには、unsigned charを使用する必要があります。

関連する問題