以十进制打印一个数字

时间:2011-12-13 15:43:15

标签: low-level number-formatting

嗯,这是一个低级别的问题 假设我存储了一个数字(当然是二进制格式的计算机商店编号) 如何以十进制格式打印。在高级程序中很明显,只需打印它,库就可以为你完成。

但是在我没有这个库的非常低级别的情况下呢。 我可以告诉输出什么'字符'。如何将数字转换为十进制字符?

我希望你理解我的问题。谢谢。

4 个答案:

答案 0 :(得分:1)

基本上,您希望将数字(存储在某个任意内部表示中)转换为其十进制表示形式。您可以通过一些简单的数学运算来完成此操作。我们假设我们有一个正数,比如1234

  1. number mod 10为您提供0到9之间的值(在我们的示例中为4),您可以将其映射到字符¹。这是最右边的数字。

  2. 除以10,丢弃余数(通常称为“整数除法”的操作):
    1234123

  3. number mod 10现在产生3第二到最右边的数字。

  4. 继续,直到number为零。


  5. 脚注:

    ¹这可以通过一个包含10个案例的简单switch语句来完成。当然,如果您的字符集具有连续顺序的字符0..9(如ASCII),'0' + number就足够了。

答案 1 :(得分:1)

如果是整数,除以10,得到结果和余数。对结果重复此过程直到零。剩余部分将从右到左给出十进制数字。为ASCII表示添加48。

答案 2 :(得分:1)

有两种打印小数的方法 - 在带有除法/余数指令的CPU上(现代CPU就是这样)和分区相对较慢的CPU(20多年前的8位CPU)。

第一种方法很简单:将数字除以10,并将余数序列存储在数组中。将数字一直分割为零后,从后面开始打印剩余部分,将ASCII码('0')添加到每个剩余部分。

第二种方法依赖于十次幂的查找表。您可以像这样定义一组数字:

int pow10 = {10000,1000,100,10,1}

然后从最大功率开始,看看是否可以从手头的数字中减去它。如果可以的话,继续减去它,并保持计数。一旦你不能减去它而不去负,打印计数加上ASCII码为零,然后继续下一个较小的10次幂。

答案 3 :(得分:0)

无论数字系统是什么,十进制,二进制,八进制。假设我在十进制计算机上有十进制值123,我仍然需要将该值转换为三个字符才能显示它们。让我们假设ASCII格式。通过查看ASCII表,我们知道我们正在寻找的答案,0x31,0x32,0x33。

如果使用整数数学将123除以10得到12.乘以12 * 10得到120,差值为3,即你的最低有效数字。我们回到12并将其除以10,给出1. 1倍10是10,12-10是2我们的下一个数字。我们将剩下的1除以10得到零,我们知道我们现在已经完成了。我们在顺序中找到的数字是3,2,1。反转顺序1,2,3。每个都添加或OR 0x30将它们从整数转换为ascii。

更改它以使用变量而不是123并使用您喜欢的任何编号系统,只要它有足够的数字来完成这种工作

你可以走另一条路,除以100 ... 000,无论你可以存储或打算找到的最大小数,然后按你的方式向前走。在这种情况下,第一个非零带有除以100给出1.保存1. 1倍100 = 100,123-100 = 23.现在除以10,这给出2,保存2,2倍10是20。23 - 20 = 3.当你除以1时,你就完成了将该值保存为你的数字。

这是另一个给定的秒数转换为小时,分钟和秒,你可以除以60,保存结果a,减去原始数字 - (a * 60)给你的余数,即秒,保存那。现在取a除以60,保存为b,这是你的小时数。减去a - (b * 60)这是剩下的几分钟,除此之外。完成小时,分钟秒。然后你可以将小时数除以24,如果你想要的话可​​以得到几天和几天,如果你想要几个星期则可以除以7。

提出了关于分歧指示的评论。划分是非常昂贵的,大多数处理器没有。昂贵的是,在一个时钟内,鸿沟会耗费你的门和电力。如果你在许多时钟中进行除法,你可能只需要进行软件除法并保存门。同样的原因大多数处理器都没有fpu,门和电源。 (门意味着更大的芯片,更昂贵的芯片,更低的产量等)。它不是现代或旧的或64位与8位或类似的情况,它是工程和商业的权衡。 8088/86有一个余数,例如余数(它还有一个bcd添加)。使用的门/大小可能比单个指令更好。乘法属于那个类别,不是很糟糕但可以。如果操作数大小不正确,则可以使任一指令(族)对程序员不起作用。这提出了另一点,我现在无法找到链接,但是一种避免分割的方法,但是从数字转换为一串十进制数字是你可以使用固定点乘以.1。我也找不到关于真正的程序员不需要浮点与自己跟踪小数点相关的引用。它的幻灯片规则与计算器的关系。我相信使用乘法除以10的文章的链接是堆栈溢出的某个地方。