【问题标题】:How binary to decimal conversion is implemented in c languagec语言如何实现二进制到十进制的转换
【发布时间】:2020-01-25 20:08:34
【问题描述】:

printf 的实现如何有效地实现整数到十进制的转换?

【问题讨论】:

  • 阅读How to Askminimal reproducible example。您的问题似乎超出了 Stack Overflow 的范围。 2 的补码不是 C 支持的唯一二进制表示。阅读语言和标准库标准文档(进行搜索)。
  • @jwdonahue:(a) 这里不需要 MRE。这个问题不是调试帮助的请求。 (b) 语言和标准库文档没有提供有关如何实现转换的信息,而这正是问题所要求的。
  • 实际上,该标准使用“未定义”和“实现定义”等形式的措辞。我总是检查新用户是否阅读过How to Ask,如果没有,我建议和minimal reproducible example 阅读。
  • any official c documentation that supports your answers 它是在标准库中实现的,它是为您的目标和编译器实现的。标准并不关心它是如何实现的。
  • 《c 语言中如何实现二进制到十进制的转换》有一个gotcha - STL 秘籍。一个标准库实现可以使用未定义的行为实现定义的行为来发挥它的优势——它可以“知道”UB和IDB是如何工作的——对于那个系统。便携式用户代码应该不是。例如。一些标准库源代码做int i; ..... unsigned u = ... (unsigned)-i;(UB 和i==INT_MIN)。因此,对于用户代码来说,查看 STL 源代码并不总是好的做法。

标签: c programming-languages implementation


【解决方案1】:

在现代计算机上,计算通常比 I/O 快得多,这里就是这种情况。 C 库将使用一种直接的方法。取模选项用于获取最低有效位,除法用于消耗数字并迭代。不幸的是,这些数字的生成顺序与 I/O 顺序相反,因此在输出之前需要对其进行缓冲。这可以通过递归来完成,但最大位数是先验已知的,因此预分配字符数组更快。

数字可能是负数,因此在循环外处理。

char digits[N];
p = &digits[N-1];
*p-- = 0;
unsigned x = integer_input;
if (integer_input < 0 && integer_input >= -INT_MAX) x = -integer_input;
do {
    *p-- = (x % 10) + '0';
    x /= 10;
} while x != 0;
if (integer_input < 0) *p-- = '-'
// now p points to c string

这是how newlib does it,尽管它支持 10 以外的基数。

这是how glibc does it

两者都遵循上述方法,尽管是通用的。

【讨论】:

  • 这是一种方法。是什么让您认为这是标准 C 库中使用的方式?他们不应该使用一些更有效的方法吗?
  • 问题是“它是如何实现的?”不是“标准要求什么?”这是我见过的几个标准库中使用的方法。
  • 我没有问标准要求什么。我问是什么让你认为这就是 C 实现的方式。它是粗糙且低效的,所以我不希望它是任何高质量的 C 实现实际使用的。这个答案断言“C 库将使用一种简单的方法。”我认为这对于好的实现来说是错误的。
  • 添加了指向 newlib 的链接
  • 谢谢,@chux-ReinstateMonica,我已经使用了你的 integer_input &gt;= -INT_MAX 建议;很有帮助。
【解决方案2】:

你只需要知道一台计算机只能执行两个操作,第一个是反码,第二个是加法。所有其他操作也由这两个操作执行。而在内存中存储数据时,如果实现了二进制补码进行转换,也是由上述两个操作推导出来的,再次进行二进制到十进制的转换。

【讨论】:

  • 首先它不是答案。如果您没有足够的声誉发表评论 - 不要将答案用作 cmets。而且你在这里写的没有太多意义
猜你喜欢
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2019-04-09
  • 1970-01-01
相关资源
最近更新 更多