[英]How is 64-bit math accomplished on a 32-bit machine?
如果實際上32位處理器的長度實際上只有32位,那么數學運算如何在64位數字上工作? 例如:
long lngTemp1 = 123456789123;
long lngTemp2 = lngTemp1 * 123;
根據MSDN,C#中的long是帶符號的64位數字: http : //msdn.microsoft.com/zh-cn/library/ctetwysk(VS.71).aspx
32位英特爾微處理器如何執行上述代碼而不會發生溢出?
他們使用進位位進行加法和減法。 “帶進位加法”和“帶進位減法”(或“借用”)的匯編程序操作可用於任意位長的擴展精度加法和減法。
對於乘法,如果只有32位乘法結果,可以將其分成16位值對並進行乘法,然后進行移位和加法(帶進位),以從32位乘法中獲得完整的64位結果。 基本上,使用長手版本(任何兩個16位乘法都適合32位結果)可用於以更有限的精度生成任意位長乘法。
FWIW,Intel 32位asm“ mul”指令可以在EDX:EAX中放入64位結果,因此您實際上可以在32位塊中進行乘法(要添加64位值),而不是16位塊(與32位值進行移位和相加)。
x86的32位指令集可用於64位算術,請參見擴展精度乘法 。
甚至32位處理器也經常帶有64位浮點單元-但是數據一次只能以32位總線傳輸。
但是,更一般而言,即使基礎處理器僅允許8位整數運算,也可以實現64位浮點。 但是,編譯器或程序員必須插入足夠的代碼才能虛擬化效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.