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

时间:2013-03-24 12:54:44

标签: c++ c

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

char c = '9';
int x = (int)(c - '0');

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

8 个答案:

答案 0 :(得分:33)

因为char全部用数字表示,'0'是第一个。

在下表中您会看到:

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


'9' => 57.

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

enter image description here 来源:http://www.asciitable.com

答案 1 :(得分:22)

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):

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

[...]

     

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

这意味着,无论字符'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'的值与{{{{}}之间的“距离” 1}}在执行字符集中。由于它们是连续的,因此距离将为9。

答案 2 :(得分:19)

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

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

  

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

的值

答案 3 :(得分:5)

因为,文字按顺序排列。

因此,如果0为48,1将为49,2将为50等。在ASCII中,则x将包含'9'的值'0' 1}}减去'9'的ascii值,这意味着x的ascii值为57,因此57 - 48 = 9将包含char

此外,{{1}}是一个整体类型。

答案 4 :(得分:3)

数字字符的代码ascii按照ascii table

中指示的'0' '1' '2' '3' '4' '5' '6' '7' '8' '9'顺序排序

因此,如果我们在'9'的asii与'0'的ascii之间产生差异,我们将获得9

答案 5 :(得分:2)

在ASCII表中,数字按顺序排列,从0的最低代码开始。如果从0中减去更高的数字,则可以创建两个ASCII值的差值。 因此,9的值为570的值为48,因此如果从57减去48,则得到9。 只需看看ASCII表。

here

答案 6 :(得分:2)

查看ASCII TABLE

'9' in ASCII =  57 //in Decimal

'0' in ASCII =  48 //in Decimal

57 - 48 = 9

答案 7 :(得分:0)

首先,试试:

cout << (int)'0' << endl;

现在尝试:

cout << (int)'9' << endl;

charictors以文本形式表示数字,但在作为数字时具有不同的值。 Windows使用数字来决定要打印的charictor。因此,数字0x30表示Windows OS中的charitor 0。数字0x39代表charitor 9.毕竟,所有计算机都可以识别数字,它不知道“char”是什么。

不幸的是(int)('f' - '0')不等于15。

这将为您提供各种charictors以及用于表示它们的窗口数。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

如果您需要查找其他操作系统,可以在Google中搜索:Virtual Key Codes <OSname>。看看其他操作系统的代码是什么。