來看一下程式碼及執行結果:
MaCarrick:mists-of-time cacaegg$ cat subtle-bug.c為什麼d明明是-1卻印出F呢?
#include
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
main(){
int d = -1, x;
if(d <= TOTAL_ELEMENTS-2){
printf("T\n");
}else{
printf("F\n");
}
}
MaCarrick:mists-of-time cacaegg$ gcc subtle-bug.c
MaCarrick:mists-of-time cacaegg$ ./a.out
F
其實是因為sizeof回傳的形態皆為unsinged。
加上當進行signed int d與unsigned int比較時,signed int會被轉成unsigned int。
所以d在是-1的情況下,其signed bit為1,當其轉為unsinged時,signed bit就成為most significant bit,使得d轉為極大的數了。
修正方法只要加上型態轉換即可:
if(d <= (int) TOTAL_ELEMENTS - 2)