我在16位CPU上遇到了long int大小的问题。查看其架构:
没有寄存器超过16位长。那么,long int如何可以有超过16位。实际上,根据我的理解,对于任何处理器,数据类型的最大大小必须是通用寄存器的大小。我是对的吗?
没有寄存器超过16位长。那么,long int如何可以有超过16位。实际上,根据我的理解,对于任何处理器,数据类型的最大大小必须是通用寄存器的大小。我是对的吗?
是的。实际上C和C++标准要求 sizeof(long int) >= 4
.*(我假设在这种情况下 CHAR_BIT == 8
)。
这也适用于32位机器上的64位整数。它的实现方式是使用两个寄存器分别表示高位和低位。
加法和减法分别需要两条指令:
在x86上:
add
和 adc
,其中adc
是“带进位加”的意思。sub
和 sbb
,其中sbb
是“带借位减”的意思。例如:
long long a = ...;
long long b = ...;
a += b;
会编译成类似以下的内容:
add eax,ebx
adc edx,ecx
eax
和edx
是“a”的低位和高位,而ebx
和ecx
是“b”的低位和高位。
双字整数的乘法和除法更加复杂,但它遵循同样类型的小学数学,不过每个“数字”都是处理器字。
long
至少有32位的宽度。如果例如 unsigned char
的范围是0-65536,那么 sizeof(long)
可能为2。 - R.. GitHub STOP HELPING ICET
的 sizeof(T)
都可以等于 1。你是在考虑“转换秩”吗? - Kerrek SBchar
拥有的位数相同。因此如果一台机器的char
有32位,则它也拥有32位的字节。 - Daniel Fischer不可以。如果机器没有能够处理32位值的寄存器,那么就必须在软件中模拟它们。可以使用任何库用于任意精度算术的相同技术来完成此操作。