The following code is from K&R textbook, page number 71:
val =10.0*val+s[i] -'0'
What does s[i] -'0'
mean here?
It seems that s
is a character array or a pointer to the first element of a character array. And element s[i]
contains a character that represents a digit as for example '5'
. To convert this character that for example in ASCII has internal code equal to 53
(while internal code of character '0'
is 48) there is used expression
s[i] -'0'
that is equivalent to
53 - 48
and equal to number 5
According to the C Standard (5.2.1 Character sets)
3...In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
So in ASCII there is a relation
Character Code value
'0' - 48
'1' - 49
'2' - 50
'3' - 51
'4' - 52
'5' - 53
'6' - 54
'7' - 55
'8' - 56
'9' - 57
For example in EBCDIC internal codes of characters that represent digits are
240 - 249
( 0 - 9 ) or in hexadecimal notation F0 - F9
.
So it is a standard way to get numeric digit from a character independing on used character set.