C专家编程—使用unsigned int可能产生的Bug(1)
???????在vs2008環(huán)境下,如下代碼顯示不同的結果:
?
???????? #include<stdio.h>
???????? #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
???????? int array[] = {23,34,12,17,204,99,16};
?????????
???????? int main(void)
??????? {
????????? ?? int d = -1;
?????????? ?if(d <TOTAL_ELEMENTS-2)
??????????????? ?? printf("success/n");
????????? ? else
???????????? ????? printf("failed/n");
?????????? ?return 0;???
??????? }
?
?????? 結果顯示failed,而將if(d <TOTAL_ELEMENTS-2)改成if(d <(int)TOTAL_ELEMENTS-2),結果顯示的是success。
?????? C專家編程對此分析的原因是:TOTAL_ELEMENTS所定義的值是unsigned int 類型(因為sizeof()的返回類型是無符號數(shù))。if語句在signed int和unsigned int之間測試相等性,所以d被升級為unsigned int類型,-1轉換成unsigned int的結果將是一個非常巨大的正整數(shù),致使表達式的值為假。要修正這個問題,只有對TOTAL_ELEMENTS進行強制類型轉換即可。
?
?????? 啟發(fā):一、盡量不要再你的代碼中使用無符號類型,以免增加不必要的復雜性。
??????????????? 二、盡量使用像int那樣的有符號類型,這樣在涉及升級混合類型的復雜細節(jié)時,不必擔心邊界情況(如-1被翻譯為非常大的數(shù))。
?????????????? 三、只有在使用位段和二進制掩碼時,才可以用無符號數(shù)。應該在表達式中使用強制類型轉換,使操作數(shù)均為有符號數(shù)或無符號數(shù),這樣就不必由編譯器來選擇結果的類型了。
?
?
總結
以上是生活随笔為你收集整理的C专家编程—使用unsigned int可能产生的Bug(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个链表创建、反转、打印的C语言代码
- 下一篇: C专家编程—分析signal函数的原型声