誰かがこれが機能する理由を説明できますか?
char c = '9';
int x = (int)(c - '0');
charのASCIIコードから「0」を引くと、そのcharが表す数値になるのはなぜですか?
charはすべて数字で表され、「0」が最初のものであるためです。
下の表で、次のことがわかります。
'0' => 48
'1' => 49
'9' => 57.
結果として:('9'
- '0'
)=(57 − 48)= 9
char
int
とファミリーのように、整数型です。タイプのオブジェクトにはchar
数値があります。'0'
文字リテラル(など)に入力する文字とオブジェクトの値の間のマッピングは、実行文字セットchar
内のその文字のエンコードによって決まります。
C ++11§2.14.3:
実行文字セットで表現可能な単一のc-charを含む通常の文字リテラルのタイプは、実行文字セットでのc-char
char
のエンコードの数値に等しい値です。
C99§6.4.4.4:
整数文字定数は、のように、一重引用符で囲まれた1つ以上のマルチバイト文字のシーケンスです
'x'
。[...]
整数文字定数のタイプは
int
。
int
はに変換できることに注意してくださいchar
。
実行文字セットの選択は、実装次第です。多くの場合、選択肢はASCII互換であるため、他の回答に掲載されている表には適切な値があります。ただし、文字セットはASCII互換である必要はありません。ただし、いくつかの制限があります。それらの1つは次のとおりです(C ++11§2.3、C99§5.2.1):
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ’
[...]
ソースと実行の両方の基本文字セットで、上記の10進数のリストの0の後の各文字の値は、前の値より1大きい値でなければなりません。
つまり、キャラクターの値が何であれ、キャラクターの値は。より1つ大きく、キャラクター'0'
の値はそれより1つ大きいというようになります。数字は連続した値です。次のようにマッピングを要約できます。'1'
'0'
'2'
Character: 0 1 2 3 4 5 6 7 8 9
Corresponding value: X X+1 X+2 X+3 X+4 X+5 X+6 X+7 X+8 X+9
すべての数字には、の値からオフセットされた値があり'0'
ます。
つまり、文字がある場合、たとえば、その文字から'9'
減算すると、実行文字セットのの値との'0'
値の間の「距離」が得られます。それらは連続しているので、距離は9になります。'9'
'0'
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
C標準では、数字の文字コードに関して文字が常にこの順序であることが保証されているためです。したがって、'0'
別の桁からの文字コードを引く0
と、その値である、に対する相対的な位置がわかります。
C標準のセクション5.2.1文字セットから:
ソースと実行の両方の基本文字セットで、上記の10進数のリストの0の後の各文字の値は、前の値より1大きい値でなければなりません。
なぜなら、リテラルは順番に配置されているからです。
したがって、ASCIIで0
48、49、50などになる場合1
は、ascii値からascii値を引いた値が含まれます。つまり、ascii値は57であるため、が含まれます。2
x
'9'
'0'
'9'
x
57 - 48 = 9
また、char
一体型です。
数値文字のコードASCIIは、 ASCIIテーブル'0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
に示されている順序で並べられています。
したがって、asiiofとasciiofを区別すると'9'
、次の'0'
ようになります。9
ASCIIテーブルでは、数字は。の最も低いコードから順番に並べられ0
ます。からより大きな数値を引く0
と、2つのASCII値の差が生じます。つまり、に9
は値が57
あり、にはがあります。したがって、 57から48を引くと、9になります。ASCIIテーブルを見てください。 0
48
ここを見てください。
初挑戦:
cout << (int)'0' << endl;
今試してみてください:
cout << (int)'9' << endl;
文字はテキスト形式で数値を表しますが、数値と見なした場合の値は異なります。Windowsは、数値を使用して、印刷する文字を決定します。したがって、数値0x30は、WindowsOSの文字0を表します。数字の0x39は、文字9を表します。結局のところ、コンピューターが認識できるのは数字だけであり、「文字」が何であるかはわかりません。
残念ながら(int)('f' - '0')
、15とは等しくありません。
これにより、さまざまな文字と、ウィンドウがそれらを表すために使用する数がわかります。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
別のOSでそれを見つける必要がある場合はVirtual Key Codes <OSname>
、Googleで検索できます。他のOSがコードとして持っているものを確認します。