[菜鸟谢谢大家了]关于强制类型转换中double转int问题

abbot123 2010-01-27 10:59:58
强制类型换中double转int时,是将小数位后面的舍去
可是,当要转换的double类型的数值大于int的取值范围,也就是大于2147483647时,
转换后的数总是2147483647,这是为什么呢?

我理解中,应该是,舍去小数位后,再把得到的整数的前4个字节砍掉,剩下的就应该是转换后的数

按我的理解,比如2147483648.123这个数,转换时,先将小数点后去掉,变成2147483648,
由于int型最大数为2147483647,所以强制转换后,在内存中2147483648表示的数应该是-2147483648。
这个过程,相当于先把double强制转换成long,然后,再由long 转成int。
可是我做了好多实验,只要比2147483647这个数值大的double型,强制转换成int时,都是214748367。

呵呵,由于是刚刚接触程序语言,对内存什么的机制可能不太明白,这里面有什么别的原因么?
为什么long转int时,会把超出4个字节的部分砍掉,而double转int时确总是2147483467呢?
(下例中的e1和e3做比较)

用下面的小程序示例:

public class TestConvert2{
public static void main(String[] args){
double i = 4294967296.123;//4294967296是(2×2147483648)的结果,方便看结果
int e1 = (int)i;//超出整形取值范围,结果为2147483647,为什么不是0?
long e2 = (long)i;//去掉小数点后面,结果为4294967296
int e3 = (int)e2;//砍掉内存中超过4字节的部分,结果为0
System.out.println(e1);
System.out.println(e2);
System.out.println(e3);
}
}
...全文
4084 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
d52787790 2010-04-23
  • 打赏
  • 举报
回复
3L才是正解,2L的不对
ronn_chl 2010-03-07
  • 打赏
  • 举报
回复
XIEXIE LE !
wenjjing2lianee 2010-01-29
  • 打赏
  • 举报
回复
为什么long转int时,会把超出4个字节的部分砍掉,而double转int时确总是2147483467呢?
这个我也不懂为什么,还是要看原理的书...
Alon知行 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lrbyantai 的回复:]
你把一桶水倒进一个杯子中,多余的水都流出来了,杯子中只能盛与其容量相等的水

反过来,把杯子水倒进桶中,它就全能盛下,而且还没满
[/Quote]

比喻得很贴切
无伤 2010-01-28
  • 打赏
  • 举报
回复
那位用水桶和杯子做比喻, 很贴切。
knightzhuwei 2010-01-28
  • 打赏
  • 举报
回复
这跟怎么存储没啥关系 关键是java语言设计让你这样做
它同样可以设计成转换溢出时变成负的 变成0 或者干脆报错
pauliuyou 2010-01-28
  • 打赏
  • 举报
回复
问题提的好. 有助于更深刻理解数据是如何存储的.
YangWenChaoX 2010-01-28
  • 打赏
  • 举报
回复
不知道你这种精神是好是坏 ?
镜花水月73 2010-01-28
  • 打赏
  • 举报
回复
int 和double存在空间大小不一致
weihthchk 2010-01-28
  • 打赏
  • 举报
回复
提示:
英文教材中,基本类型(如从double到int)的转换,叫做Type Conversion;引用类型的“转换”,叫做Class Casting。用词完全不同,体会一下这里的差别吧。
不知道哪位高人,把两者混为一谈然后教育别人。居然还流行了起来。
weihthchk 2010-01-28
  • 打赏
  • 举报
回复
这就是规定吧,从来没考虑过这个问题。
有一点要知道,基本类型的转换,在编译器处理后会变成一串指令。这一串指令会从原来的值运算得到转换后的值。这和引用类型的“转换”是不同的。
楼主的发现,应该就体现了Java编译器是如何处理基本类型转换的吧。
single_pen 2010-01-28
  • 打赏
  • 举报
回复
二楼的兄弟已经说的很清楚了!~~学习下....呵呵
wenlin113 2010-01-28
  • 打赏
  • 举报
回复
呵呵 跟我一样菜鸟的人也很多啊 一起努力吧
crazylaa 2010-01-28
  • 打赏
  • 举报
回复
哎。。。。。。。。。。。。。
楼主,如果你只能一次吃1kg食物,我给你1吨,你说你这次是吃1kg呢,还是1吨?
cbajing 2010-01-27
  • 打赏
  • 举报
回复
这你就看看计算机是怎么样保存数字的了,
看看有关 计算机机组成原理 方面的书吧!硬件相关
xinzhifan4 2010-01-27
  • 打赏
  • 举报
回复
看似简单的问题,但要是弄清原理其实很难
qianzhimeiying 2010-01-27
  • 打赏
  • 举报
回复
整型和浮点型的数字存储布局不一样的
整型是1符号位,后面数字位,所以long转int就取模,就是后32位
浮点型的double是1符号位11指数位52小数位以及1023偏移附加,
虽然和long同样占64位,但是存储方式完全不一样,转int时不是取模的
蛋黄车 2010-01-27
  • 打赏
  • 举报
回复
你把一桶水倒进一个杯子中,多余的水都流出来了,杯子中只能盛与其容量相等的水

反过来,把杯子水倒进桶中,它就全能盛下,而且还没满
借我那把枪吧 2010-01-27
  • 打赏
  • 举报
回复
你的问题:可是,当要转换的double类型的数值大于int的取值范围,也就是大于2147483647时,
转换后的数总是2147483647,这是为什么呢?
当你使用强制转换的时候即更改变量的类型,而变量类型有整型,实型,字节,字符,布尔这几种,强制类型换中double转int时,内存空间也跟着变,即double(内存中占8个字节)转int(内存中占4个字节)后,Int在内存中的数值范围:2147483647~-2147483648,Double数值范围:1.797693e+308~4.900000e-324
你强制类型换中double转int时,类型变为Int了,当然存值范围也变更,你的数字大了,内存空间只有那么一点,所以只能存内存空间的最大值,其他的溢出了
回去看书吧,这么基础的解释也废劲,就相当于1+2为何等于3,因为1+2中的2等同于1+1,所以1+2=1+1+1=3
不知道你楼主你明白了没有
Sou2012 2010-01-27
  • 打赏
  • 举报
回复
这个比较复杂, 计算机原理
面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化的软件系统有了一定的延续性,同时继承也是封装程序可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》关于桥梁模式的部分)。 - 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。 - 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

62,636

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧