簡體   English   中英

32位處理器如何支持64位整數?

[英]How does a 32 bit processor support 64 bit integers?

在C ++中,您可以使用通常為4個字節的int long long整數通常是8個字節。 如果cpu是32位,那不會將它限制為32位數嗎? 如果它不支持64位,為什么我可以使用long long整數? alu可以添加更大的整數或其他東西嗎?

大多數處理器包括進位標志和溢出標志,以支持對多字整數的操作。 進位標志用於無符號數學運算,溢出標志用於有符號數學運算。

例如,在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

也可以在更高級別的語言(如C ++)中實現此類功能,但是它們支持它的功能要少得多,因此代碼通常比使用匯編語言編寫時要慢得多。

大多數操作基本上都是串行的。 當您在二進制級別進行加法時,您需要兩個輸入位並產生一個結果位和一個進位。 然后,在添加下一個最低有效位時,進位位用作輸入,等等在整個字上(稱為“紋波加法器”,因為在單詞上添加“漣漪”)。

有一些更復雜的添加方法,當特定的添加不產生依賴性時,可以減少一位與另一位之間的依賴性,並且大多數當前硬件使用這樣的東西。

然而,在最壞的情況下,將1加到已經是給定字大小支持的最大數字將導致從每個位到下一個位生成進位,一直到整個單詞。

這意味着(至少在某種程度上)CPU支持的字寬度限制了它可以運行的最大時鍾速度。 如果有人想要足夠嚴重,他們可以構建一個與1024位操作數一起使用的CPU。 但是,如果他們這樣做,他們有兩個選擇:要么以較低的時鍾速度運行,要么采用多個時鍾來添加一對操作數。

還要注意,當你擴展這樣的操作數時,你需要更多的存儲空間(例如,更大的緩存)來存儲盡可能多的操作數,更多的門來執行每個單獨的操作,等等。

因此,如果使用相同的技術,您可以擁有一個運行速度為4 GHz的64位處理器,例如4兆字節的緩存,或者運行速度大約為250 MHz且可能具有2兆字節緩存的1024位處理器。

如果你的大部分工作都是在1024位(或更大)的操作數上,后者可能會獲勝。 大多數人不會經常在1024位操作數上進行數學運算。 事實上,64位數字足以滿足大多數用途。 因此,支持更廣泛的操作數可能會在大多數時間成為大多數人的凈損失。

即使底層硬件僅直接支持較少的位,也可以支持任意寬的整數(通過軟件實現)。 如果將32位整數添加到另一個32位整數,它可能會溢出並需要33位來存儲答案。 軟件可以檢測到發生了這種溢出(處理器有一個可以檢查的進位標志 ),另一個代表64位數字最高有效位的32位字可以遞增1。

這里有一些關於進位標志及其使用方式的更多信息。

基本上,通常單指令添加分為兩個(或三個)步驟:

1)使用通常的add指令添加低32位。 注意這個加法是否會產生“進位”位(也就是說,如果結果實際上需要33位來表示)。

2)以相同的方式添加高位32位。 如果從低位開始有進位,則在此處設置進位(或者,在添加后將結果加1)。

您使用兩個內存位置來存儲該號碼。 數字的一半存儲在存儲器中的一個位置,另一半存儲在相鄰存儲器位置。

您可能還會考慮在8位CPU的時代我們曾經處理過16位甚至32位大小的整數。 沒有什么能限制任何特定的alu處理除內存空間之外的任意大小數字,最終我認為用戶的耐心。

例如,Smalltalk總是提供任意長度的整數,因為最初的Dorados和Altos - 將我們帶回到1970年。想要963的確切值! - 去做就對了。 它需要一段時間才能將其格式化以進行打印。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM