为什么在C中减去'0'会导致char表示的数字?

Sil*_*iu. 22 c c++

有人可以解释为什么这有效吗?

char c = '9';
int x = (int)(c - '0');
Run Code Online (Sandbox Code Playgroud)

为什么从char的ascii代码中减去'0'会导致char表示的数字?

Jea*_*ean 34

因为char都用数字表示,'0'是第一个.

在下表中,您会看到:

'0' => 48
'1' => 49


'9' => 57.
Run Code Online (Sandbox Code Playgroud)

其结果是:('9'- '0')=(57 - 48)= 9

在此输入图像描述 资料来源:http://www.asciitable.com

  • 在[我工作的机器](http://en.wikipedia.org/wiki/EBCDIC#Codepage_layout)上,我们有''0'=> 240`,但是''9'` - ''0'仍然是9. (6认同)
  • +1.(EBCDIC有点特殊),但你是对的.这就是为什么''9' - '0''是正确的做法,应该避免''9' - 48`.On总是可以预期字符0到9按升序设置,但它们的实际值可能不同. (3认同)
  • 这假设正在使用 ASCII 编码。 (2认同)
  • @LightnessRacesinOrbit - 不,不是。它假定无论使用哪种编码,都连续存储(并按升序)值 0 到 9 的内部表示。它们的绝对值无关紧要,它们的顺序性才是最重要的。祝你好运找到一个不按顺序存储它们的相关字符集。 (2认同)

Jos*_*eld 22

char是一个整数类型,就像int和家人一样.类型的对象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):

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
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ’
Run Code Online (Sandbox Code Playgroud)

[...]

在源和执行基本字符集中,上述十进制数字列表中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
Run Code Online (Sandbox Code Playgroud)

所有数字字符都具有偏移值的值'0'.

这意味着,如果您有一个字符,让我们说'9''0'从中减去,您将获得执行字符集中值'9'和值之间的"距离" '0'.因为它们是连续的,所以距离将是9.

  • 在C中,普通字符文字...的类型为`int`. (3认同)

小智 19

因为C标准保证字符0, 1, 2, 3, 4, 5, 6, 7, 8, 9始终按照其数字字符代码的顺序排列.所以,如果你'0'从另一个数字中减去char代码,它将给出它相对于它的位置0,这就是它的价值......

从C标准,第5.2.1节字符集:

在源和执行基本字符集中,上述小数位数列表中0之后的每个字符的值应大于前一个值的值.


Ani*_*nge 5

因为,文字是按顺序排列的.

因此,如果0是48,1将是49,2将是50等在ASCII中,那么x将包含,ascii值'9'减去ascii值,'0'这意味着,ascii值'9'将是57,因此,x将包含57 - 48 = 9.

此外,char是一个整体类型.

  • 这不依赖于区域设置是ASCII. (2认同)