double轉(zhuǎn)unsigned int等于?
如題所述抱冷,今天碰到一個(gè)很隱晦的Bug崔列,調(diào)用一個(gè)函數(shù)的結(jié)果總是不符合預(yù)期。
問(wèn)題
先看問(wèn)題:
doube num_double = -1;
unsigned int num_uint = num_doube;
num_uint會(huì)是多少旺遮?
先說(shuō)答案赵讯,是0。
數(shù)值轉(zhuǎn)換的坑
上面的答案可能不夠準(zhǔn)確耿眉,在ARM平臺(tái)上是0边翼,在x86平臺(tái)上是-1的補(bǔ)碼。
我們?cè)趯W(xué)校學(xué)到的知識(shí)是基于x86平臺(tái)的鸣剪,即:
整型負(fù)數(shù)的類型轉(zhuǎn)換组底,是在其補(bǔ)碼上做高位的去除和填補(bǔ),浮點(diǎn)型負(fù)數(shù)的類型轉(zhuǎn)換筐骇,是取其整數(shù)部分的補(bǔ)碼做高位去除和填補(bǔ)债鸡。
由于負(fù)數(shù)在底層存儲(chǔ)是補(bǔ)碼,會(huì)造成無(wú)符號(hào)與有符號(hào)數(shù)字在比較铛纬,計(jì)算的不方便(有符號(hào)會(huì)轉(zhuǎn)成無(wú)符號(hào))厌均。但浮點(diǎn)數(shù)負(fù)數(shù)的類型轉(zhuǎn)換,在我的腦海里一直是老師教的那樣告唆,取整數(shù)部分棺弊,直到今天栽了坑。
負(fù)數(shù)轉(zhuǎn)無(wú)符號(hào)整數(shù)
當(dāng)負(fù)數(shù)是整數(shù)時(shí)擒悬,無(wú)符號(hào)整數(shù)只是換了一種表達(dá)方式來(lái)解釋它的補(bǔ)碼模她,所以-1是4294967295。
當(dāng)負(fù)數(shù)是浮點(diǎn)數(shù)時(shí)懂牧,浮點(diǎn)數(shù)的存儲(chǔ)是尾數(shù)+指數(shù)的方式侈净,不能直接將其二進(jìn)制數(shù)據(jù)轉(zhuǎn)為無(wú)符號(hào)整數(shù)表達(dá)。這就依賴平臺(tái)的實(shí)現(xiàn)了僧凤,具體的ARM會(huì)轉(zhuǎn)成0用狱,而x86會(huì)轉(zhuǎn)成整數(shù)部分。
如何避免產(chǎn)生Bug
當(dāng)實(shí)際參數(shù)和形參類型不同是拼弃,要避免在傳參時(shí)直接使用函數(shù)返回值的情況夏伊,如:
double funcA(){
return -100.000000001;
}
void funcB(unsigned int num){
print num;
}
我們?cè)谑褂脮r(shí)要避免funcB(funcA())
的形式, 這樣會(huì)直接輸出0, 最好用臨時(shí)變量存住funcA
的值再使用。