都知道不同型別運算元進行運算時,發生的轉換,資料型別一般朝著浮點度更高,長度更長的方向轉換,但signed
向unsigned
轉換得多多注意了,有如下**:
#includeint a=;
#define cd (sizeof(a)/sizeof(int))//sizeof()還回值為unsigned
int main()
最後結果為654321
,說明當
signed
與unsigned
運算時是朝著
unsinged
轉變的,這就使程式出現了乙個微妙的
bug
要修復它為if(d<=(int )cd)
即可,所以盡量不要在**中使用無符號型別,以免增加不必要的複雜性,尤其是,不要僅僅因為無符號數不存在負值(如年齡、國債)而用它來表示數量,盡量使用像
int那樣的有符號型別,這樣在涉及公升級混合型別的複雜細節時,不必擔心邊界情況。只有在使用位段和二進位制掩碼時,才可以用無符號數。應該在表示式中使用強制型別轉換,使運算元均為有符號數或者無符號數,這樣就不必由編譯器來選擇
C語言乙個微妙的Bug
1 include stdio.h 23 intarray 4 define total elements sizeof array sizeof array 0 56 void main 7執行結果是不列印true。解釋 total element所定義的值是unsigned int型別,因為si...
微軟的乙個BUG
各位,我不知道我的這個發現屬不屬於微軟的乙個bug round 1.225,2 1.23 round 1.245,2 1.25 round 1.265,2 1.26 round 1.285,2 1.28 按照技術文章上說的,vb中round 函式屬於四捨五入函式,但實際執行當中,其實round 函式...
乙個 Bug 的生命
android 開源專案維護乙個公共問題追蹤,你能報告 bug 和要求特徵為 android 軟體棧。這個問題上的跟蹤細節,請看報告 bug 頁 報告 bug 是偉大的 感謝你!但是一旦你歸檔乙個 bug 報告發生了什麼?這頁介紹乙個 bug 的生命。租約注意 android 開源專案 aosp 問...