簡體   English   中英

為什么在 C 中減去“0”會導致 char 代表的數字?

[英]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值為570值為48 ,所以如果你從 57 中減去 48 你會得到 9。看看 ASCII 表。

這里

查看ASCII 表

'9' in ASCII =  57 //in Decimal

'0' in ASCII =  48 //in Decimal

57 - 48 = 9

第一次嘗試:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM