[英]How does atof.c work? Subtracting an ASCII zero from an ASCII digit makes it an int? Am I missing something?
因此,作为我的 C 课程的一部分,对于我们的第一个作业,我们应该实现自己的 atof.c function,然后将其用于某些任务。 因此,作为一个聪明的全职学生,我决定查看 atof.c 源代码并对其进行调整以满足我的需求。 我想我已经参与了这个 function 所做的大部分操作,比如计算小数点前后的数字,但是有一行代码我不明白。 我假设这是实际将 ASCII 数字转换为 int 类型数字的行。 在这里发布:
frac1 = 10*frac1 + (c - '0');
在源代码中,c 是他们正在处理的数字,而 frac1 是一个 int,用于存储来自传入 ASCII 字符串的一些数字。 但为什么 c- '0' 工作? 作为后续,是否有另一种方法可以达到相同的结果?
'0' 的 ASCII 值是代码页 437(IBM 默认字符集)中的第 48 个字符。 类似地,“1”是第 49 个等等。就自我记录而言,减去“0”而不是诸如 48 之类的幻数要清楚得多。
C 中没有“文本”之类的东西。 只是碰巧将 integer 值视为文本信息的 API。 char
是一个 integer 类型,你可以用它做数学运算。 字符文字实际上是 C 中的int
(在 C++ 中它们是char
,但即使在那里它们仍然可以用作数值)。
'0'
是人类写“零字符序数值”的好方法; 在 ASCII 中,这是数字 48。由于在我知道的所有编码中,数字按从0
到9
的顺序出现,因此您可以通过减去'0'
将编码中的序数值(例如 ASCII)转换为实际数值'0'
以获取从0
到9
的实际int
值。
您可以直接减去48
(编译时,无法分辨您使用的是哪个选项; 48
和 ASCII '0'
无法区分),对于阅读您源代码的其他人来说,您所做的事情就不那么明显了.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.