【问题标题】:How is int implemented in any compiler?int 在任何编译器中是如何实现的?
【发布时间】:2018-09-05 17:11:37
【问题描述】:

在 64 位处理器中,一次处理 64 位数据。因此,当要执行任何算术运算时,它是在 ALU 中使用 ACCUMULATOR 完成的,它也是 64 位的。

int的大小在大多数情况下都超过2个字节。 2 字节的 int 是如何实现的(算术运算)?

【问题讨论】:

  • 在大多数 64 位处理器中,64 位值也超过 2 个字节,因此 int 可以毫无问题地放入其中
  • 如您所说,ALU 没有累加器。在最简单的形式中,它只接收 2 个操作数、一个操作选择并输出一个操作数。在许多嵌入式系统中可能有一个累加器寄存器,但它不在 ALU 内部,并且没有一个更强大的架构拥有它,尽管在 x86 中使用 ax/eax/rax 有一点残余

标签: int compiler-construction


【解决方案1】:

当然,基本思想是二进制数。但是有很多细节使事情复杂化。这取决于硬件和编译器。

我在这里提到的每种方式都使用了表示整数的编译器。

表示事物的一种可能方法是尽可能地制作最大的二进制整数。使用 64 位,并取回一位作为符号,您得到 2 的 64 次幂减 1,或略高于 1.8 x 10^19。

如果您想进行加减运算,这是可以的。但是乘法很乏味,因为您需要对每一位进行一次乘法。浮动协处理器可以为您提供帮助。

某些硬件将支持有趣的功能,因此利用它很有用。例如,一些CPU芯片将支持二进制编码的十进制。

https://en.wikipedia.org/wiki/Binary-coded_decimal

如果你大到还记得 Z80,那它是我用过的第一个有 BCD 的 CPU。

https://en.wikipedia.org/wiki/Zilog_Z80

这意味着您只需要在 4 位级别进行二进制处理,因为十进制数的每个数字都与其他数字分开。如果硬件直接支持它,那么您可以避免编写代码来转换整数和十进制之间的所有 64 位。它没有那么高效。使用 64 位,去掉一个作为符号,你只能得到 15 位。

同样,加减法很容易。乘法变成了以二进制实现逐位乘法的问题,然后对超过 10 的结果包括进位。

不同的硬件会支持不同的东西。存在大端与小端的问题。

https://chortle.ccsu.edu/AssemblyTutorial/Chapter-15/ass15_3.html

在深奥的硬件上还有很多其他的可能性。

【讨论】:

  • 谁告诉你multiplies are tedious because you need to do one multiply for each bit?乘法的低部分总是相同的,所以只需做符号或零扩展,然后像正常一样做
  • @phuclv 你刚刚描述了“对每一位做一个乘法运算”。
  • 没有。我什至不明白你的意思。无论您乘以多少位,您总是必须将它们加在一起才能得到结果。但是没有现代架构在位上进行数学运算。已知最窄的架构是 4 位。要在 16 位架构上进行 32x32 乘法运算,只需将 4 个 16 位部分相乘并将结果相加即可。只需要 4 次操作,而不是 32*32 = 1024 位操作。要在 64 位 PC 上执行相同操作,可以使用完整的 64x64 乘法,32 位操作数位于 64 位寄存器的低位
  • @phuclv 要添加 b1 b2 b3 b4 和 d1 d2 d3 d4,您需要进行 4 次按位相加,并带有进位。
  • 没有。编译器不这样做。你甚至读过问题的标签吗?没有人会傻到在单条指令有效的情况下在一个对字进行操作的 CPU 上进行逐位加法,除了家庭作业练习。 FPU 在这里不相关,因为它执行浮点运算,而不是整数运算
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2011-11-13
  • 1970-01-01
  • 2010-10-09
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多