16位处理器如何具有4字节大小的长整数?

cla*_*aws 4 c assembly computer-architecture

在此输入图像描述

long int对16位CPU 的大小有疑问.看看它的架构:

在此输入图像描述

没有寄存器超过16位长.那么,怎么会有long int超过16位.事实上,根据我的任何处理器,数据类型的最大大小必须是通用寄存器的大小.我对吗?

Mys*_*ial 11

是.事实上,C和C++标准要求sizeof(long int) >= 4.*

(我假设CHAR_BIT == 8在这种情况下.)

这与32位机器上的64位整数相同.它的实现方式是使用两个寄存器来表示下半部分和上半部分.

加法和减法作为两个指令完成:

在x86上:

  • 另外:addadc其中adc的"添加带有进"
  • 减法:subsbb这里sbb是"带借减"

例如:

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

a += b;
Run Code Online (Sandbox Code Playgroud)

会编译成类似的东西:

add eax,ebx
adc edx,ecx
Run Code Online (Sandbox Code Playgroud)

在哪里eaxedx是上部的a.并且是ebxecx的下部和上部b.

双字整数的乘法和除法更复杂,但它遵循相同的小学数学 - 但每个"数字"是处理器字.

  • 不,它们要求`long`的宽度至少为32.`sizeof(long)`可以是2,例如,`unsigned char`的范围是0-65536. (3认同)
  • @claws C和C++标准没有说明字节有多大(除了至少8位IIRC) - 尽管事实上它几乎总是等于8位. (2认同)