標籤:個數 實驗 com code .com c 語言 輸出 int amp
2147483648的緣起
最近其實一直都在是摸魚的狀態,編程也很少了。其實自己真的想有一段時間啥都別顧及的只是敲代碼就行了的時光。說我怠惰也好,現在感覺就是我幹什麼都有一種沒有用的感覺。
這次碰到的這個問題源於我們C 語言課上的實驗
#include <stdio.h>int main(){ int max(int x,int y); int a,b,c; while (1){ printf("input a&b: "); scanf ("%d,%d",&a,&b); c=max(a,b); printf("max=%d\n",c);} return 0;}int max(int x,int y){ int z; if (x>y) z=x; else z=y; return z;}
本來也沒什麼,只是突然間有位老哥好像發現了新大陸
”哦豁,爆掉了“= =,輸入超大的數最後反而會輸出一個根本不在兩者之間的負數。
立刻丟掉了無聊的實驗內容,開始研究這個問題的本質。其實就是資料溢出吧。
實驗內容
其實之前還是瞭解了一下,int的範圍在vc6裡是-231~231-1,也就是-2147483648~2147483647。於是便開始瘋狂試探。
的確是2147483647的力量。
但現在有一個新的疑問便是 -1141710350 又是從何而來的呢?
監視變數
說來慚愧...我之前編程為了查看一個變數裡的內容,不停的用print,messagebox。。
知道現在知道可以用監視
可以發現一賦值123412341234就立馬變成了-1141710350
這時還是請出程式猿計算機吧。。
從上面的測試可以看出,這個數是與123412341234有關的
而它的二進位編碼是?0001 1100 1011 1011 1111 0010 1110 0001 1111 0010?
而如果只保留32位的話便成了1011 1011 1111 0010 1110 0001 1111 0010
這裡恰恰就是 -1141710350 的二進位代碼。
ps:位鍵盤真好玩= =
在2147483647的邊緣瘋狂試探