一个16位处理器如何具有4个字节大小的long int?

4
我在16位CPU上遇到了long int大小的问题。查看其架构:
没有寄存器超过16位长。那么,long int如何可以有超过16位。实际上,根据我的理解,对于任何处理器,数据类型的最大大小必须是通用寄存器的大小。我是对的吗?

2
这并不是真的,想象一下一个具有32位寄存器的处理器处理64位双精度值-它可能不太高效,但在需要更宽的数据类型的较少情况下,您可以处理它们。 - im so confused
@AK4749:双精度浮点数值在浮点寄存器中处理。据我所记,这些寄存器的大小是通用寄存器的两倍。难道不是这样吗? - claws
你可能是对的,我只是知道在64位处理器之前就有64位数据类型哈哈,让我去调查一下。 - im so confused
1
所以在64位处理器出现之前,确实存在更长的整数,但即使在今天,最大的FP寄存器也是64位,这并不是64位常规寄存器的两倍,所以如果现在不是真的,也许曾经是真的? - im so confused
1
32位机器现在已经有十年或更长时间进行80位浮点数运算了。能力和性能是两个不同的事情。OP的问题是关于数据类型的最大大小。软件允许无限大小(取决于存储限制)的操作,与ALU的大小无关。8位处理器可以进行80位浮点数运算或2048位定点数运算,没有问题。尽管许多设计不仅没有FPU,而且没有除法运算,一些甚至没有乘法运算,但我们仍然可以在这些系统上运行Linux,并进行固定和浮点数的乘除运算。 - old_timer
2个回答

12

是的。实际上C和C++标准要求 sizeof(long int) >= 4.*(我假设在这种情况下 CHAR_BIT == 8)。

这也适用于32位机器上的64位整数。它的实现方式是使用两个寄存器分别表示高位和低位。

加法和减法分别需要两条指令:

在x86上:

  • 加法: addadc,其中adc是“带进位加”的意思。
  • 减法: subsbb,其中sbb是“带借位减”的意思。

例如:

long long a = ...;
long long b = ...;

a += b;

会编译成类似以下的内容:

add eax,ebx
adc edx,ecx

eaxedx“a”的低位和高位,而ebxecx“b”的低位和高位。

双字整数的乘法和除法更加复杂,但它遵循同样类型的小学数学,不过每个“数字”都是处理器字。


3
不,它们要求 long 至少有32位的宽度。如果例如 unsigned char 的范围是0-65536,那么 sizeof(long) 可能为2。 - R.. GitHub STOP HELPING ICE
所有整数类型 Tsizeof(T) 都可以等于 1。你是在考虑“转换秩”吗? - Kerrek SB
尽管这不是问题的一部分,但是怎么可能一个字节不等于8位呢?:O - claws
2
@claws C和C++标准并没有规定字节的大小(除了至少为8位,如果我没记错的话)-尽管它几乎总是等于8位。 - Mysticial
1
@claws 在C或C++中,一个字节的定义是与char拥有的位数相同。因此如果一台机器的char有32位,则它也拥有32位的字节。 - Daniel Fischer

2

不可以。如果机器没有能够处理32位值的寄存器,那么就必须在软件中模拟它们。可以使用任何库用于任意精度算术的相同技术来完成此操作。


此外,在某些情况下,可能会有一个扩展或协处理器可以处理大于寄存器数的数字。(例如,在32位x86上,SSE可以处理64位数字(尽管更困难) - Earlz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接