編程中無窮大的設定
很多人可能設為0x7fffffff,這個數的確是32-bit int的最大值,符號位為0,其他的都是1
但在很多情況下,0x7fffffff會出現錯誤,比如溢出,這樣兩個無窮大數相加會變成負數,還有如在做dijkstra求最短路時,當做松弛操作,判斷if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v]時,若u到v沒有路勁,w[u][v]=0x7fffffff,這樣d[u]+w[u][v]會變成負數,這就產生了錯誤。
為了盡量避免以上的錯誤,我們可以改變無窮大的設定,可以將0x3f3f3f3f設為無窮大,0x3f3f3f3f的10進制表示為1061109567,這個數已達到10^9,足以表示無窮大,又0x3f3f3f3f+0x3f3f3f3f=2122219134,滿足無窮大+無窮大仍為無窮大
當把無窮大設為0x3f3f3f3f時,在做初始化時也很方便,比如在初始化數組a時,可以使用
Memset(a,0x3f,sizeof(a)),因為0x3f3f3f3f的每個字節都是0x3f,如果使用0x7fffffff,需要循環賦值,耗費更多時間
#include<stdio.h>#include<string.h>#define MAX1 0x7fffffff#define MAX2 0x3f3f3f3fint a[3];int main(){ memset(a,0x3f,sizeof(a)); PRintf("%d/n",MAX1); printf("%d/n",MAX1*2); printf("%d/n",MAX2); printf("%d/n",MAX2*2); for(int i=0;i<3;i++) printf("%d ",a[i]); printf("/n"); return 0;}
參考:http://blog.csdn.net/mylovestart/article/details/8238088
新聞熱點
疑難解答