[英]Why does subtracting '0' in C result in the number that the char is representing?
有人可以解釋為什么這有效嗎?
char c = '9';
int x = (int)(c - '0');
為什么從 char 的 ascii 代碼中減去“0”會得到該 char 所代表的數字?
因為字符都是用數字表示的,而 '0' 是第一個。
在下表中,您可以看到:
'0' => 48
'1' => 49
'9' => 57.
結果:( '9'
- '0'
) = (57 − 48) = 9
資料來源: http : //www.asciitable.com
char
是整數類型,就像int
和 family 一樣。 char
類型的對象具有一些數值。 您在字符文字中鍵入的字符(如'0'
)與char
對象具有的值之間的映射由執行字符集中該字符的編碼決定:
C++11 §2.14.3:
包含可在執行字符集中表示的單個c-char的普通字符文字具有
char
類型,其值等於執行字符集中c-char編碼的數值。
C99 §6.4.4.4:
整數字符常量是用單引號括起來的一個或多個多字節字符的序列,如
'x'
。[...]
整數字符常量的類型為
int
。
請注意, int
可以轉換為char
。
執行字符集的選擇取決於實現。 通常情況下,該選擇與 ASCII 兼容,因此其他答案中發布的表格具有適當的值。 但是,字符集不需要與 ASCII 兼容。 不過也有一些限制。 其中之一如下(C++11 §2.3,C99 §5.2.1):
abcdefghijklmnopqrstu vwxyz ABCDEFGHIJKLMNOPQRSTU VWXYZ 0 1 2 3 4 5 6 7 8 9 _ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \\ " '
[...]
在源和執行基本字符集中,上述十進制數字列表中 0 之后的每個字符的值都應比前面的值大 1。
這意味着無論字符'0'
具有什么值,字符'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'
的值和'0'
的值之間的“距離”。 由於它們是連續的,因此距離將為 9。
因為 C 標准保證字符0, 1, 2, 3, 4, 5, 6, 7, 8, 9
關於它們的數字字符代碼總是按這個順序排列的。 所以,如果你從另一個數字中減去'0'
的字符代碼,它將給出它相對於0
位置,這是它的值......
從 C 標准,第 5.2.1 節字符集:
在源和執行基本字符集中,上述十進制數字列表中 0 之后的每個字符的值都應比前面的值大 1
因為,文字是按順序排列的。
因此,如果0
是48, 1
將是49, 2
將是50等。在ASCII,然后x
將包含的ASCII值'9'
減去的ASCII值'0'
,其手段,ASCII值'9'
將是 57,因此, x
將包含57 - 48 = 9
。
此外, char
是一個整數類型。
數字字符的代碼 ascii 按照ascii 表中指示的順序'0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
所以如果我們區分'9'
asii和'0'
ascii,我們將得到9
在 ASCII 表中,數字按順序排列,從0
的最低代碼開始。 如果從0
減去更大的數字,則會創建兩個 ASCII 值的差值。 所以, 9
值為57
, 0
值為48
,所以如果你從 57 中減去 48 你會得到 9。看看 ASCII 表。
看這里。
第一次嘗試:
cout << (int)'0' << endl;
現在嘗試:
cout << (int)'9' << endl;
字符以文本形式表示數字,但作為數字時具有不同的值。 Windows 使用數字來決定要打印的字符。 所以數字 0x30 代表 windows 操作系統中的字符 0。 數字 0x39 代表字符 9。畢竟計算機只能識別數字,它不知道“字符”是什么。
不過,不幸的是(int)('f' - '0')
不等於 15。
這為您提供了各種字符和用於表示它們的數字窗口。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
如果您需要為其他操作系統找到它,您可以在 Google 中搜索: Virtual Key Codes <OSname>
。 查看其他操作系統的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.