對於作業分配,我必須在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」的組合。
爲什麼要投票?這似乎足夠有效。 – Brian