有人可以解释为什么会有效吗?
char c = '9';
int x = (int)(c - '0');
为什么从char的ascii代码中减去'0'会导致char表示的数字?
答案 0 :(得分:33)
因为char全部用数字表示,'0'是第一个。
在下表中您会看到:
'0' => 48
'1' => 49
'9' => 57.
结果:('9'
- '0'
)=(57 - 48)= 9
答案 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
的值为57
而0
的值为48
,因此如果从57减去48,则得到9。
只需看看ASCII表。
看here。
答案 6 :(得分:2)
答案 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>
。看看其他操作系统的代码是什么。