[問題] 關於overflow(精華區2-12)
我試著做了精華區2-12說的那幾個問題:
使用64bit電腦+Lubuntu 15.04+gcc
1.
long int a, b, c;
a= 40000L;
b= 60000L;
c= a*b;
printf("c= %ld\n", c);// 請問,c= ???, why?
這題如果是64bit電腦,long int會是8 bytes,所以結果會是2400000000沒錯
可是如果換成int(sizeof(int)=4),printf改("%d")
會變成c= -1894967296 (overflow)
可是如果type用int可是printf用%ld,顯示出來就還是2400000000
(當然compiler有warning)
請問這算undefined behaviour嗎?因為C standard好像沒看到有這種自動升級的
2.
long a, b;
a= 10;
b= a + 1;// b= 11, > a
while (b > a) {
a++;
b+= 1;
}
printf("a= %ld, b= (a+1)= %ld\n", a, b);
我把a的初始值調很大,所以一下就出來了
a= 9223372036854775807, b= (a+1)= -9223372036854775808
3.
double a, b;
a= 4.0*atan(1.0);// a= 3.1415926 ...
b= a + 1.0;// b= 4.1415926 ..., > a
while (b > a) {
a*= 1.001;
b= a + 1.0;
}
printf("a= %.3lf, b= (a + 1.0)= %.3lf\n", a, b);
// 請問:a= ???, b= ???, why?
這題我跑的結果是
a= 9026451774346548.000, b= (a + 1.0)= 9026451774346548.000
看了冼鏡光對浮點運算的介紹應該大概知道為何了。
(不過可以不跑程式預測其值嗎?好像不可能)
2-12那7個問題真的很有趣...
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 86.200.100.19
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1432150589.A.F70.html
→
05/21 04:48, , 1F
05/21 04:48, 1F
→
05/21 04:50, , 2F
05/21 04:50, 2F
推
05/21 05:38, , 3F
05/21 05:38, 3F
→
05/21 05:39, , 4F
05/21 05:39, 4F
→
05/21 06:09, , 5F
05/21 06:09, 5F
→
05/21 09:08, , 6F
05/21 09:08, 6F
→
05/21 13:07, , 7F
05/21 13:07, 7F
→
05/21 15:42, , 8F
05/21 15:42, 8F
請問2.的undefined behaviour是指發生overflow後的處理嗎?(程式停掉或繼續)
還是overflow本身?
3.是implementation defined? 因為各家編輯器的浮點數規格不同嗎?
※ 編輯: wtchen (86.200.100.19), 05/21/2015 15:58:17
→
05/21 16:06, , 9F
05/21 16:06, 9F
→
05/21 16:07, , 10F
05/21 16:07, 10F
→
05/21 16:09, , 11F
05/21 16:09, 11F
→
05/21 16:11, , 12F
05/21 16:11, 12F
→
05/21 16:12, , 13F
05/21 16:12, 13F
→
05/21 16:13, , 14F
05/21 16:13, 14F
→
05/21 16:15, , 15F
05/21 16:15, 15F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章