Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
32位处理器如何支持64位整数? 在C++中,可以使用 int >代码>,通常为4字节。long整数通常为8字节。如果cpu是32位的,那么它不会限制为32位数字吗?如果整数不支持64位,为什么我可以使用longinteger?alu可以添加更大的整数或其他什么吗?_C++_Integer - Fatal编程技术网

32位处理器如何支持64位整数? 在C++中,可以使用 int >代码>,通常为4字节。long整数通常为8字节。如果cpu是32位的,那么它不会限制为32位数字吗?如果整数不支持64位,为什么我可以使用longinteger?alu可以添加更大的整数或其他什么吗?

32位处理器如何支持64位整数? 在C++中,可以使用 int >代码>,通常为4字节。long整数通常为8字节。如果cpu是32位的,那么它不会限制为32位数字吗?如果整数不支持64位,为什么我可以使用longinteger?alu可以添加更大的整数或其他什么吗?,c++,integer,C++,Integer,您使用两个内存位置来存储数字。一半的数字存储在内存中的一个位置,另一半存储在相邻的内存位置。可以支持任意宽的整数(通过软件实现),即使底层硬件只直接支持较少的位。如果将一个32位整数与另一个32位整数相加,可能会溢出,需要33位来存储答案。软件可以检测到发生了此溢出(处理器有一个可以检查的),并且表示64位数字中最高有效位的另一个32位字可以增加1 大多数处理器包括进位标志和溢出标志,以支持对多字整数的操作。进位标志用于无符号数学,溢出标志用于有符号数学 例如,在x86上,您可以添加两个无符号的

您使用两个内存位置来存储数字。一半的数字存储在内存中的一个位置,另一半存储在相邻的内存位置。

可以支持任意宽的整数(通过软件实现),即使底层硬件只直接支持较少的位。如果将一个32位整数与另一个32位整数相加,可能会溢出,需要33位来存储答案。软件可以检测到发生了此溢出(处理器有一个可以检查的),并且表示64位数字中最高有效位的另一个32位字可以增加1


大多数处理器包括进位标志和溢出标志,以支持对多字整数的操作。进位标志用于无符号数学,溢出标志用于有符号数学

例如,在x86上,您可以添加两个无符号的64位数字(我们假设它们在EDX:EAX和EBX:ECX中),如下所示:

add eax, ecx  ; this does an add, ignoring the carry flag
adc edx, ebx  ; this adds the carry flag along with the numbers
; sum in edx:eax
<> P>在C++等高级语言中也可以实现这种类型的东西,但是它们支持它的能力要差很多,所以代码通常比用汇编语言编写时慢得多。 大多数操作本质上是串行的。当你在二进制级别做加法时,你需要两个输入位,并产生一个结果位和一个进位。然后,当在字上添加下一个最低有效位时,进位将用作输入,依此类推(称为“涟波加法器”,因为该加法在字上“涟波”)

当一个特定的加法不产生依赖性时,有更复杂的加法方法可以减少一位和另一位之间的依赖性,而大多数当前的硬件都使用这种方法

然而,在最坏的情况下,将
1
添加到给定字长支持的已经最大的数字将导致在整个字中生成从每一位到下一位的进位

这意味着(至少在某种程度上)CPU支持的字宽对其运行的最大时钟速度施加了限制。如果有人非常想这样做,他们可以构建一个使用1024位操作数的CPU。但是,如果他们这样做,他们将有两个选择:要么以较低的时钟速度运行,要么以多个时钟添加一对操作数

还要注意,当您像那样扩展操作数时,需要更多的存储(例如,更大的缓存)来存储尽可能多的操作数,需要更多的门来执行每个操作,等等

因此,如果采用相同的技术,您可以拥有一个运行频率为4GHz的64位处理器,比如说,有4兆字节的缓存,或者一个运行频率为250MHz的1024位处理器,可能有2兆字节的缓存


如果您的大部分工作是在1024位(或更大)操作数上进行的,则后者可能是一个胜利。不过,大多数人根本不经常对1024位操作数进行数学运算。事实上,64位数字在大多数情况下都足够大。因此,对大多数人来说,支持更宽的操作数在大多数情况下可能是一种净损失。

基本上,通常的单指令加法分为两(或三)个步骤:

1) 使用常用的Add指令添加低位32位。注意此加法是否会生成“执行”位(即,如果结果实际需要33位来表示)


2) 以相同的方式添加高阶32位。如果有来自低阶位的执行,在这里设置进位位(或者,或者,在加法之后加上一个)。

您也可以考虑我们在8位CPU的日子里使用了16位甚至32位大小的整数。除了内存空间之外,没有任何东西限制任何特定的alu处理任意大小的数字,最终我认为是用户的耐心


例如,Smalltalk从最初的Dorados和Altos开始就一直提供任意长度的整数,这让我们回到1970年。想要精确的值963!-想做就做不过,将其格式化以打印需要一段时间。

好吧,这取决于您要做什么。假设您要添加两个数字:首先添加低阶部分,然后添加生成进位的高阶部分。如果您想了解更多信息,最好学习汇编代码。@user3452725整数不能四舍五入,因为它们总是一个整数。@Steve抱歉我是说carrySo为什么不能有128位整数?甚至256位?我知道有这方面的课程,但为什么电脑不能做到这一点呢?@user3452725他们可以,您只需告诉他们-通过链接这些进位指令。@user3452725:加法基本上是一种串行操作-将两个最低有效位相加将生成一个结果位和一个进位,当添加下一个最低有效位时,该进位将用作输入。有一些优化可以减少这种依赖性,但在最坏的情况下,你可以一直进行,所以这是不可避免的。因此,虽然它们可以在单个操作中支持更宽的字,但这样做会降低速度,而且大多数人不经常使用128位或256位数字。类似的考虑也适用于减法、乘法等。参见Knuth第2卷第4.3节