Java可不可以用无符号数字?
偶然碰到下面这个很奇怪的东西,不知道是为什么?请大家试试看看!
这样输出的是正数:
long l=(long) (2.0*1024*1024*1024);
System.out.println(l);这样输出是却是负数:
long l=(long) (2*1024*1024*1024);
System.out.println(l);
有谁可以给我解释?
偶然碰到下面这个很奇怪的东西,不知道是为什么?请大家试试看看!
这样输出的是正数:
long l=(long) (2.0*1024*1024*1024);
System.out.println(l);这样输出是却是负数:
long l=(long) (2*1024*1024*1024);
System.out.println(l);
有谁可以给我解释?
楼主你的 第二个 改成这样 就ok了 ,你在看看结果,明显是超出范围了long l=(long) 2*1024*1024*1024;
System.out.println(l);为什么 你第一个是整数呢?2.0 是什么 float 所以你前面那个是 float转为long
后面这个是int 转成long 溢出了
long l=(long) (2*1024*1024*1024);
计算的时候,(2*1024*1024*1024)的结果按int型算的,2的31次方,已经溢出了。
2*1024*1024*1024是2的31次方,int类型是32位,去掉一个符号位就是31位,正好溢出,所以变为负的了
long l=(long) (2.0*1024*1024*1024);
而float类型虽然也只有32位,但是他不是直接存储数据,而是以IEE754的标准存储的,
1 8 23 位长
+-+--------+-----------------------+
|S| Exp | Fraction |
+-+--------+-----------------------+
31 30 23 22 0 位编号
S为符号位,Exp为指数位,Fraction为有效数位,float是以指数的形式存储数据,所以他的范围比同为32位的int大的多,所以不会溢出,所以转为64位的long时,为正