黑马程序员技术交流社区

标题: 关于基本数据转换问题 [打印本页]

作者: 会飞De石头    时间: 2014-5-13 22:26
标题: 关于基本数据转换问题
问题1:
                long s1 = 1333641600000l;
                long s2 = 1329408000000l;       
                System.out.println(s1-s2);                //4233600000
                System.out.println((int)(s1-s2));       //-61367296
                               
                System.out.println(14-10); //int 型  结果为4
                System.out.println(14l-10l); //long型  结果为4

现在想问:数据准换时候,特别是long类型向int类型转换时,怎么进行转换的?小白,实在不太懂。

问题2:关于数据类型提升过程中 括号的优先级 问题
                int a = 8;  int b = 8;
               
                int a1 = a++;
                int a2 = (b++);
结果 a1 与a2一样 ,现在想问,还有什么情况下括号的影响可以类似这样忽略呢?
作者: 郝义涛    时间: 2014-5-13 23:04
我在这儿回答问题二:我感觉int a2=(b++);
b++;  相当于 b=b+1;所以原式相当于int a2=b=b+1;
像这样的情况很多,就不举例了,我在这儿只是说明一下,为什么加括号与不加括号是一样的。
作者: 李小新H    时间: 2014-5-14 07:35
同样不懂!求答案!
作者: 假Rǔ有⒈兲    时间: 2014-5-14 17:34
第一个是 long a1=54654
             int    a2=(int)a1  吧
作者: 土突突    时间: 2014-5-15 01:02
关于long转换为int的情况。
首先s1-s2=4233600000L,为长整形,在内存中占8个字节。共64位。它的二进制形式在内存中为
00000000 00000000 00000000 00000000 11111100 01010111 10011100 00000000
当long转换为int类型时,由于int只占4个字节,共32位。故会取long类型的后32位存入int类型中。此时int类型的
二进制表示为:   11111100 01010111 10011100 00000000。可以看到首位是1,故该数为负数。
而负数是正数的补码表示。因此可以通过计算该数的补码然后取负就可以得到该负数的值。计算过程如下
  源码:  11111100 01010111 10011100 00000000  (4233600000L的二进制形式)
  反码:  00000011 10101000 01100011 11111111   (源码取反得反码,既0变1,1变0)
  补码:  00000011 10101000 01100100 00000000   (源码加1得补码)
通过计算补码的值为  61367296,取负后为 -61367296。
然后是:
int a = 8;  int b = 8;
int a1 = a++;
int a2 = (b++);
你这个等式右边就一种计算过程。就是自增运算。加不加括号都会进行自增运算。

作者: 会飞De石头    时间: 2014-5-17 09:51
土突突 发表于 2014-5-15 01:02
关于long转换为int的情况。
首先s1-s2=4233600000L,为长整形,在内存中占8个字节。共64位。它的二进制形式 ...

很感谢。受用了
作者: 别小乐    时间: 2014-5-17 10:43
赞一个,赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2