2013-10-06 45 views
3

對於作業分配,我必須在C中編寫一個函數,它將兩個有符號整數相加,但如果會出現正溢出則返回INT_MAX,如果出現則返回INT_MIN負溢出。我必須嚴格遵守我可以使用哪些運營商的限制。所有整數都是二進制補碼形式,右移是算術運算,整數大小是可變的(我可以用sizeof(int)< < 3)找到它。我不能使用contagals,循環,比較操作符或投射。我只能使用按位和邏輯運算符,加法和減法,相等性測試以及整數常量INT_MAX和INT_MIN。飽和帶符號的整數加法,只用C中的按位運算符(HW)

我知道如果兩個輸入具有相同的符號並且結果具有不同的符號,則可以檢測到溢出。我已經到了有一個標誌顯示公式是否溢出的地步。我不知道如何從那裏到最終產品。這是我到目前爲止有:

int saturating_add(int x, int y){ 
    int w = sizeof(int)<<3; 
    int result = x+y; 
    int signX = (x>>w-1)&0x01;//Sign bit of X 
    int signY = (y>>w-1)&0x01;//Sign bit of Y 
    int resultSign = (result>>w-1)&0x01; //Sign bit of result 
    int canOverflow = ~(signX^signY); //If they're the same sign, they can overflow 
    int didOverflow = (resultSign^signX)&canOverflow; //1 if input signs are same and result sign different, 0 otherwise 

} 

我想跟隨在Bitwise saturated addition in C (HW)所示的答案,但我卡上的部分,我必須填寫的,但所有的與同位整數符號位(1進入0111..11和0進入0000.00)。我不知道什麼是「變化和OR」的組合。

+1

爲什麼要投票?這似乎足夠有效。 – Brian

回答

2

我想你誤解了答案。你應該做的是擴展符號位到所有的位,包括MSB。這可以通過拿着符號位的int來完成,例如didOverflow,併爲其補碼加1。

然後你會發現在溢出的情況下應該返回哪個溢出值。這可以通過異或INT_MAX與擴展signX(或signY,都將工作)完成。我們稱這個值爲overflow。最後,改變overflowresult這樣的:

overflow := (extended didOverflow) AND overflow 
result := (NOT (extended didOverflow)) AND result 

現在,這些任務後,如果擴展didOverflow爲1 ... 1,然後overflow顯然會保持不變。 result,在另一方面,將等於0。

但如果didOverflow是0 ... 0,則相反適用:現在overflow是0,而result保持不變。

在第一種情況下(其中didOverflow是1 ... 1,表明存在溢出),overflow OR result等於overflow。在第二種情況下(我們沒有溢出),overflow OR result等於result。所以無論哪種方式,overflow OR result都會給我們正確的價值。