問題由來
今天有朋友在使用MAX(A,B)的時候出現(xiàn)了一個詭異的問題:
代碼是這樣的:
而執(zhí)行的結果竟然是這樣的:
“我是不是眼花了灿渴?max(-1,0)返回了-1?”我的朋友驚訝到胰舆。
這不科學啊逻杖,怎么會負數(shù)比0大呢?于是我查看了MAX(A,B)的源碼:
驗證過程
然后我做了如下兩個實驗(請注意調試區(qū)a的類型):
實驗1:(a的類型為unsigned long)
實驗2:(a的類型為int)
通過這兩個實驗我們可以發(fā)現(xiàn):由于NSArray的count屬性是個NSUInteger類型思瘟,因此_typeof(array.count - 1) 會得到一個無符號的類型荸百,當array.count - 1為負數(shù)的時候,就相當于(NSUInteger)(負數(shù)) = 正數(shù)滨攻,因此會有MAX(array.count - 1, 0) = (NSUInteger)(array.count - 1)够话。如下圖所示:
結論:
當使用MAX(A,B)取大值的時候要注意A、B是否是無符號型光绕,可以統(tǒng)一將它們轉換成有符號型來進行比較女嘲。如下圖: