文字「A」が0x41と比較されるのはなぜですか?


89

私はいくつかのC ++コードを見ていて、次の構造を見つけました:

if('A' == 0x41) {
  // ...
} else if('A' == 0xc1) {
  // ...
} else {
  // ...
}

次のようなVisual Studioの警告が表示されます。

警告C4127条件式は定数です。

Visual Studioは明らかに正しいです-確かに 'A'は0x41と定義されています。3つのブランチのうちの2つがデッドコードであるとすると、なぜこのコードを作成しているのですか?


30
それらは必ずしもデッドコードではありません、おそらくそれは文字セットをチェックするためのただの方法です。
ジョージ、

60
'A' = EBCDICのC1
ハロルド

14
私はそれをユーティリティヘッダー#define IS_CHSET_EBCDIC ('A' == 0xc1)などに入れます。または、最新のC ++では、それをにしconstexprます。
ピーター-2016年

8
@ b.buchhold-いいえ、PCからメインフレームにクロスコンパイルできます。したがって、「A」は実行文字セット内の文字の値を意味する必要があります。
Bo Persson 2016年

2
これは、プリプロセッサの条件付きインクルード(たとえば、#if 'a' == 41 ... #else ... #endif)を使用して動的ブランチではなくこれを行うのが最善のようであり、このような警告が表示されないようにします。 。それはうまくいくでしょうか?
templatetypedef

回答:


116

0xc1EBCDIC文字セットコードですA。著者はそのようなマシンをテストしています。

http://www.ibm.com/support/knowledgecenter/en/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html


14
「これよりも文字セットをチェックする良い方法はありますか?」そのための標準的な方法はありません。C11では、特定のUnicodeエンコーディングが使用されているかどうかを確認する方法がありますが、MSVCはC99(C11より前のバージョン)を完全にはサポートしていません。「この代替文字セットはどれほど一般的ですか!」IBMメインフレーム以外に?どういたしまして。

2
それで、最終的なelseブランチは何ですか?ASCIIでもEBCDICでも互換性のない使用中の文字エンコードはありますか?
dan04

8
@ dan04私が知っていることはありませんが、「未知のエンコーディング、エラーメッセージの出力」ブランチと同じくらい現実的には単純なものになる可能性があります。

8
Apple II DOS 3.3文字エンコーディングでは、「A」も0xC1であり、ASCIIまたは0x80でORされます。
Damian Yerrick 2016年

2
@Rhymoid実際には、MicrosoftがC99をサポートする前にC11を実装する可能性は十分にあります。それらは、実装が困難なC99機能に反対するベンダーの1つでした。そのうちの2つは、C11en.wikipedia.org/wiki/…で必須ではなくなりました。
Steve Cox

11

一見すると、それはデッドコードのように見えるかもしれませんが、 'A' == 0x41は常にtrueを返すとは限りません。

開発者がここでやろうとしたことは、ASCIIまたはEBCDICのバリアントを実装するマシンがどのエンコーディングであるかを怠惰に見つけることです

@Richardが提案したように、Capital aは、International-Extended Binary Coded Decimal Interchange Codeで0xc1にマップされ ます。

ここに画像の説明を入力してください

別の別の値が、例としてASCIIによって検出されます。

ここに画像の説明を入力してください

彼もそうすることができたでしょう:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}

2番目の段落では、EBDICではなくEBCDICを意味しましたか?
Zze
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.