将字符串转换为数字时,为什么减去'0'?
我是C新手,我一直在寻找一个定制函数在C中将字符串转换为整数,我碰到这个算法,除了一个部分是非常有意义的。 -'0'
究竟是做什么的n = n * 10 + a[c] - '0';
?将字符串转换为数字时,为什么减去'0'?
int toString(char a[]) {
int c, sign, offset, n;
if (a[0] == '-') { // Handle negative integers
sign = -1;
}
if (sign == -1) { // Set starting position to convert
offset = 1;
}
else {
offset = 0;
}
n = 0;
for (c = offset; a[c] != '\0'; c++) {
n = n * 10 + a[c] - '0';
}
if (sign == -1) {
n = -n;
}
return n;
}
该算法没有从我找到它的位置解释,here。
减去'0'
作品的原因是,从小数位开始的'0'
开始顺序排列字符代码点,没有间隙。换句话说,'5'
的字符代码大于'0'
的字符代码5; '6'
的字符代码大于'0'
的字符代码6,依此类推。因此,从另一个数字的代码中减去零'0'
的代码将生成相应数字的值。
这种安排对于ASCII码,EBSDIC,UNICODE十进制数码等是正确的。对于ASCII码,数字代码是这样的:
'0' 48
'1' 49
'2' 50
'3' 51
'4' 52
'5' 53
'6' 54
'7' 55
'8' 56
'9' 57
假设x
具有'0'
和'9'
之间,x - '0'
产生0
和9
之间的值的范围内的值。因此,x - '0'
基本上将十进制数字字符常量转换为其数字整数值(例如,'5'
至5
)。
Ç说'0'
到'9'
是实现定义的值,但是C也保证'0'
到'9'
是连续的值。
对不起,我还没有理解这个,在这种情况下是'x','n'? – 2014-09-27 23:23:43
@Bridenstine这里'x'在你的程序中是'a [c]' – ouah 2014-09-27 23:25:01
见http://www.asciitable.com/ - 注意数字字符 – user2864740 2014-09-27 23:22:38
否,*字符*''0的关系(和值) ''的值是48,'\ 0''是0是NUL。 – user2864740 2014-09-27 23:28:48