打印十进制数字



嗯,这是一个低级问题假设我存储一个数字(当然是二进制格式的计算机存储数字(如何以十进制格式打印。这在高级程序中很明显,只需打印出来,图书馆就会为您完成。

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

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

有两种

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

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

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

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

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

如果为整数,除以 10,则得到结果和余数。对结果重复该过程,直到零。其余部分将从右到左为您提供十进制数字。添加 48 表示 ASCII

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

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

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

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

  4. 继续number直到为零。


脚注:

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

数字系统是什么,十进制,二进制,八进制并不重要。 假设我在十进制计算机上有十进制值 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 时,您就完成了将该值保存为您的 1 数字。

这是另一个给定的秒数转换为小时和分钟和秒,您可以除以 60,保存结果 a,减去原始数字 - (a*60( 给出您的余数,即秒,保存它。 现在取 A 除以 60,另存为 B,这是您的小时数。 减去 a - (b*60( 这是余数,即分钟保存。 完成小时,分钟秒。 然后,您可以将小时数除以 24 以获得天(如果需要(和天数,然后

根据需要除以 7。提出了

关于分割指令的评论。 分频非常昂贵,大多数处理器都没有。 昂贵的是,在一个时钟中,分频器会花费您的门和电源。 如果你在许多时钟中进行分频,你不妨做一个软件分频并保存门。 与大多数处理器没有 fpu、门和电源的原因相同。(门意味着更大的芯片,更昂贵的芯片,更低的产量等(。 这不是现代或旧或 64 位与 8 位或类似的东西的情况,它是一种工程和商业权衡。 例如,8088/86 有一个带有余数的除法(它还有一个 BCD 加法(。 如果使用门/尺寸可能比单个指令更好。 乘法属于这一类,没有那么糟糕,但可以。 如果操作数大小不正确,则可以使任一指令(系列(对程序员没有用处。 这带来了另一点,我现在找不到链接,但一种避免除法但从数字转换为十进制数字字符串的方法是您可以使用定点乘以 .1。 我也找不到关于真正的程序员不需要与自己跟踪小数点相关的浮点数的报价。 这是计算尺与计算器的事情。 我相信关于使用乘法除以 10 的文章的链接位于堆栈溢出的某个地方。

最新更新