use*_*922 0 embedded binary assembly numbers bigint
我觉得这个问题可能有点蠢。。
由于我们存储位来指示数字,并且由于我们拥有整个 RAM,因此我们应该能够拥有一个无限大小(实际上是自定义大小)的数字,该数字可以占用整个 RAM(或其指定部分) )。
正确的?
例如,如果我们这样做:
mov ax, 0xFFFF
add ax, 1
jc custom_function ; if I remember correctly jc checks the carry flag
Run Code Online (Sandbox Code Playgroud)
custom_function 是一个标签/函数,它具有一种算法来设置下一个位以创建无限大小的数字。
问题
这可能吗?如果不是无限大小的数字,则指定自定义(比默认值更长或更短)
我怀疑,如果可能的话,它的性能会很差(即使数量更短)。你怎么认为?
你认为拥有这样的东西会很好吗?(也许在内存有限的旧系统或嵌入式系统中这会更有效?)
- 这可能吗?如果不是无限大小的数字,则指定自定义(比默认值更长或更短)
是的当然。您可以定义任何您想要的表示形式和数据类型,仅受环境限制。
但是,由于内存的大小是有限的,因此值的范围也是有限的。即使您觉得千兆字节“有点”无限。想想用更多位数计算数学常数 PI 吧。有时你的 RAM 已满。
标准术语是任意精度算术,或bignum / bigint。处理它的一种方法是动态字数组(如 C++ std::vector),其上限由系统的实际限制决定,但仅使用实际需要的存储量。
- 我怀疑,如果可能的话,它的性能会很差(即使数量更短)。你怎么认为?
这取决于。如果您在 8 位机器上实现一些巧妙的算法,那么这种特殊类型的 6 位值的性能可能会比long.
但可以肯定的是,最晚当特殊类型的位数多于最长支持的“标准”类型时,性能将会下降。如果将 bignum 存储为动态数组,则始终会具有额外的间接级别,即使对于小数字,这也会增加开销。
少量优化是可能的,例如将位视为值而不是指针的标志位。(Python 实现执行类似的操作;Python 3 整数始终是任意精度,因此正常情况是适合一个“块”位的小整数。)与简单的指令相比,这仍然需要更多代码来检查内容add。
- 你认为拥有这样的东西会很好吗?(也许在内存有限的旧系统或嵌入式系统中这会更有效?)
已经有提供此类类型的库,例如GMP(GNU 多精度库),它为大多数体系结构(包括 32 位和 64 位 x86)提供了手写的 asm。
在“过去”,这种算法甚至在个人电脑上也是标准的。例如,我在 1980 年左右开始了我的职业生涯,使用的是 Intel 8080 和 Z80 处理器,这些处理器通常使用 8 位算术。它们有16 位加法和减法指令,但它们的使用涉及大量将值移入和移出寄存器。
指令集包括考虑和不考虑进位的加法指令。减法也是如此。通过这些指令,即使是这些古老的处理器也可以处理故意宽的值。
哦,8位机至今仍在使用。例如,使用 AVR 查找 Arduino。但这些都是针对特殊爱好的。世界上使用的 16 位处理器可能比 PC 更多(或更少),通常隐藏为“嵌入式”控制器。