题目是:假设一个人的心跳每分钟跳70次,或到70岁,那么他的心脏总共跳多少下呢?
这是我最近从书上看到的一个关于心跳的运算。说白了,就是数据类型的取值长度。咱也不分婴幼儿、青壮年、老年心跳不一样,也不分运动不运动,就假设每分钟一样,行吧?
那不就是:
public static void main(String[] args) {
int dayTimes = 70 * 60 * 24;
int yearTimes = dayTimes * 365;
int lifeTimes = yearTimes * 70;
System.out.println(lifeTimes);
}
这个结果是:-1719527296。??????怎么可能呢?一个人的心跳数是负值呢?更何况这个是几个正整数的相乘,没理由会出现负值哈。懵逼吧。
貌似发现了什么,计算结果超出了int长度。那换个方法算算。
public static void main(String[] args) {
long lifeTimes = 70*60*24*365*70;
System.out.println(lifeTimes);
}
还是-1719527296。不行?再加个东西。
public static void main(String[] args) {
long lifeTimes = 70*60*24*365*70*1L;
System.out.println(lifeTimes);
}
又是-1719527296。我要卒了。换换顺序呢?
public static void main(String[] args) {
long lifeTimes = 1L*70*60*24*365*70;
System.out.println(lifeTimes);
}
哇,终于算到了,是2575440000。那我变化下呢?
public static void main(String[] args) {
long lifeTimes = 70L*60*24*365*70;
System.out.println(lifeTimes);
}
OK,是2575440000。那在转换下呢?
public static void main(String[] args) {
long lifeTimes = (long)70*60*24*365*70;
System.out.println(lifeTimes);
}
阔以,还是2575440000。
public static void main(String[] args) {
long lifeTimes = (long)(70*60*24*365*70);
System.out.println(lifeTimes);
}
啪,打回原形,-1719527296。唉。
通过对比发现,计算过程中,如果遇到了更高的数据类型(int类型的数据运算中遇到了long型的数据)才做必要的转换。所以当遇到“1L”时,已经计算了“70*60*24*365*70”结果,而此结果是int类型的,尽管表达式最后会因“1L”转变成long型,但是溢出已经发生了,此时的“1L”并没有起到预期效果。所以,放到前面久OK了。
另外,长整型数据的后缀是“L”或者“l”,但是建议用“L”,以免字母“l”与数字“1”混淆。