黑马程序员技术交流社区
标题: 求助题目 [打印本页]
作者: 345723427 时间: 2016-4-13 01:30
标题: 求助题目
1.. double i=(10*0.1*0.1*0.1*0.1);
int j=8850;
int y=1;
int z=2;
while(i*z<8850){
y++;
z=2*z;
}
System.out.println("y="+y); //输出的Y为24
System.out.println("z="+z); //z为16777216
2.. int i=10^(-4);
int j=8850;
int y=1;
int z=2;
while(i*z<8850){
y++;
z=2*z;
}
System.out.println("y="+y); //输出的Y为28
System.out.println("z="+z); //z为268435456
3. int i=10^(-4);
int j=8850;
int y=1;
int z=2;
while(i*z<8850){
y++;
z=2*z;
}
System.out.println("y="+y); //输出的Y为27
System.out.println("z="+z); //z为134217728
4..int i=10^(-4);
int j=8850;
int y=1;
int z=2;
while(i*z<8850){
y++;
z=2*z;
}
System.out.println("y="+y); //输出的Y为28
System.out.println("z="+z); //z为268435456
为什么上面输出的结果不一样啊 卡死很久了 求解答
作者: zhongyuxin1011 时间: 2016-4-13 10:30
本帖最后由 zhongyuxin1011 于 2016-4-13 21:27 编辑
2、3、4有区别吗?那就一起说吧,int的取值范围-2^31~2^31-1。2、3、4都是一样的原因,超出取值范围(i*z),刚开始10和-4异或运算结果还是负数,负数乘以正数还是负数,直到最后一次(y=28)后,乘积超出范围,丢失部分后数据比8850大,结束while循环。
作者: Yoyoqiu 时间: 2016-4-13 10:49
class Test_003 {
public static void main(String[] args) {
int i = 10^(-4);
double j=10*0.1*0.1*0.1*0.1;
System.out.println(i); //打印 -10
System.out.println(j); // 打印0.001
}
}
/* 后面三个结果是一样的 ,第一个不一样
楼主可能想表达的是 i= 10^(-4) 就是10的负次四方赋值给i
假设可以的话 i=0.0001 结果不一样 多个0
问题在于 10^(-4)中的^表示的是 位异或 不是平方立方的意思
所以初始值不同 结果不同*/
作者: Yoyoqiu 时间: 2016-4-13 11:09
再解释一下 int取值最大是2147483547
题目中2 3 4 的 i 的初始值都是 -10
也就是说 while 看起来像 是个死循环 因为-10 是负数 所以条件一直成立
但是只到 z 自己翻倍超出 int 范围 然后赋值给 z 的一个错误结果 但是可能是负数 循环条件就不满足了 才会结束
所以打印才会有结果
作者: 345723427 时间: 2016-4-13 13:18
谢谢各位 太感谢了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |