java 负数double转int,一个有意思的类型转换问题double转int

C++:

0x7FFFFFFF * 2.0 这一步会先将 0x7FFFFFFF 提升为 double 类型,计算结果也是 double 类型。再转型为 int 会截断小数部分,但整数部分的值大于 int 的取值范围了,这样转型会发生什么 C++ 标准没有规定。不过大部分编译器会直接按位保留,如果是这样的话,结果就是 0xFFFFFFFE。

而 int 是有符号整型,最高位(符号位)为 1 代表这是负数,所以为 -2。从结果看是这样的。

另外,编译器很有可能会对乘法作优化,0x7FFFFFFF 乘以 2 等于是左移动一位变成 0xFFFFFFFE,所以结果还是 -2。

Java:

算术运算时一样会进行类型转换。首先 0x7FFFFFFF * 2.0 的结果也是 double 型。这个浮点型的整数部分还是超过了 int 的范围,这样的浮点数向 int 转型时会转为int 能表示的最大数值,也就是 0x7FFFFFFF,所以结果是 2147483647。

这里你可以看出 C++ 和 Java 在处理浮点值向整型转型的不同之处:C++ 基本上是按位截断,而 Java 在浮点向整型转换时会尽量满足原本数值的含义(既然浮点值超过了int范围,那么干脆让int取最大值)

顺便一提:在 Java 中,如果你先把 0x7FFFFFFF * 2.0 的结果转为 long,再转为 int,就能得到和 C++ 一样的结果了。因为 Java 整型间转型规则和 C++ 一样:从低位截断,同样可能引起符号变化问题。  这样由于 long 能保留那个浮点型的数值,再转为 int 就和 C++ 的行为一样了,结果会是 -2.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验内容: 一、定义一个名为Circle的圆类,位于shape包中。要求如下: (1) 该类需要描述圆在二维坐标系中的位置,圆心的横、纵坐标值均取整数;描述圆的半径,取双精度类型。 (2) 无参构造方法将圆心坐标设为坐标圆点,半径设为1.0;有参构造方法需要根据参数值设置圆心坐标和半径值。 (3) 提供一个计算圆面积的方法double getArea()。 (4) 提供一个判断当前圆对象与参数圆对象是否相交的方法(相交方式见下图): boolean isIntersected(Circle another) (5) 提供一个判断当前圆对象是否包含参数圆对象的方法(包含方式见下图): boolean contains(Circle another) (6) 提供一个判断当前圆对象与参数圆对象的大小关系的方法(判断依据是半径,半径之差的绝对值小于0.0001认为相等;返回负数表示当前圆对象小,0表示相等,正数表示当前圆对象) int compareTo(Circle another) (7) 提供返回当前圆的字符串的方法,格式为:[Circle(x,y)-raduis] String toString() 二、定义一个包含main方法的类TestCircle,位于shape包中。要求如下: (1) main方法中调用以下方法。 (2) 编写静态方法createArray,生成位置和大小均随机的10个圆对象,置于数组中。 (3) 编写静态方法sort对这10个圆对象进行升序排序,并输出。 (4) 编写静态方法computeArea计算这10个圆中互不相交和包含的圆的面积之和。 提交要求:打包为可以执行的JAR文档,其中要包含源程序文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值