[问题] 关于overflow(精华区2-12)

楼主: wtchen (没有存在感的人)   2015-05-21 03:36:27
我试着做了精华区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个问题真的很有趣...
作者: Feis (永远睡不着 @@)   2015-05-21 04:48:00
1. undefined behaviour, 2. undefined behaviour3. implementation defined
作者: LPH66 (-6.2598534e+18f)   2015-05-21 05:38:00
3. 若浮点数为 IEEE754 则答案会在刚超过 2^53 时停止因为这时这浮点数的 ulp 是 2, +1 不足一个 ulp 故不会变动
作者: uranusjr (←這人是超級笨蛋)   2015-05-21 06:09:00
冼 ㄒ一ㄢˇ
作者: dritchie (卍~迈斯纳效应~卍)   2015-05-21 09:08:00
冼 不是念成 sheng3 吗?怎么是 xian3?
作者: KoenigseggG (地表最速)   2015-05-21 13:07:00
姓氏是唸ㄒ一ㄢˇ,其他不清楚。
楼主: wtchen (没有存在感的人)   2015-05-21 15:42:00
我也记得是ㄒ一ㄢˇ,可是我的gcin没有这字
作者: bibo9901 (function(){})()   2015-05-21 16:06:00
有号整数 overflow 就是 undefined behavior意思是运算的结果变成什么都合理implementation defined 意思是 C standard 没规定浮点数的储存方式. 若某个平台上不是用 IEEE754 答案就不一样了. 简言之, 这几个问题与其说是 C 问题, 不如说是计算机组织的问题.翻了一下精华区, 原来这些问题的作者是 sjgau 呀 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com