C語言乙個微妙的Bug

2022-05-22 20:45:09 字數 692 閱讀 3146

1

#include 

<

stdio.h

>23

intarray =;

4#define

total_elements (sizeof(array)/sizeof(array[0]))56

void

main()

7執行結果是不列印true。

解釋:total_element所定義的值是unsigned int型別,因為sizeof()返回型別是無符號數。if語句在signed int和unsigned int之間測試大小關係,所以d被提公升為unsigned int型別。 -1轉換成unsigned int 的結果將是乙個非常巨大的正整數,導致if判斷為假。

解決方法:可以修改第四行為:#define

total_elements (int)(sizeof(array)/sizeof(array[0]))

建議:盡量不要在**中使用無符號型別,以免增加不必要的複雜性。尤其是,不要僅僅因為無符號數不存在負值(如年齡、國債等)而用它來表示數量。盡量使用int那樣的有符號型別,這樣在涉及公升級混合型別的複雜細節時,不必擔心邊界的情況(如-1被轉化為非常大的正整數)。

只有在使用位段和二進位制掩碼的時候,才可以使用無符號數。應該在表示式中使用強制型別轉化,是運算元均為有符號數或者無符號數,避免編譯器來選擇結果的型別。

乙個微妙的bug

都知道不同型別運算元進行運算時,發生的轉換,資料型別一般朝著浮點度更高,長度更長的方向轉換,但signed 向unsigned 轉換得多多注意了,有如下 includeint a define cd sizeof a sizeof int sizeof 還回值為unsigned int main 最...

微軟的乙個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 問...