無符號數相減得到的是無符號還是有符號?

wzhang741發表於2014-04-11
最近看了有個題目,寫一個函式用來判斷一個字串是否比另一個大,前提是要用到字串庫函式strlen,它給出個答案
  1. int strlonger(char *s, char* t)
  2. {
  3.   return strlen(s) - strlen(t) < 0;
  4. }
這個答案在某種情況下會出錯,並且解釋為什麼會出錯怎麼修改。
提示說strlen返回的是unsigned型別,我當時第一反應是如何s字串長度比t的小,那麼兩個無符號的數相減是一個有符號的負數呢,還是一個無符號的數,如果是有符號那就沒有問題,無符號當然就會有問題了,為了解決疑惑,做了以下實驗:
1.  s = "abc", t = "abcd", strlonger返回值為1;
2.  在1的條件下,修改return語句,(unsigned)(strlen(s) - strlen(t)) < 0, strlonger返回值為0;
3.  在1的條件下,修改return語句,strlen(s) - strlen(t) < 0u, strlonger返回值為0;
由此可推斷兩個無符號相減是有符號的,那麼本題到底有哪裡有問題呢?那就是無符號值的表達範圍Max_int比有符號大,再xian

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29444108/viewspace-1140422/,如需轉載,請註明出處,否則將追究法律責任。

相關文章