A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 了无尘 于 2012-5-3 22:31 编辑

如题,但有一点,x-1之类的答案是肯定不对的。

注意:我说的是自减是如何实现的!!!!!!!!

8 个回复

倒序浏览
--x;
在java编译时,不分配内存空间,运行时使用一次就开辟一个临时空间存--x;
与C语言不同,C语言中变量的内存空间是在编译时分配的,一个变量名只对应一块内存区域。

点评

貌似跟题目没有任何联系,我的问题是,--x这个自减是如何实现的  发表于 2012-5-3 22:19
回复 使用道具 举报
--x先自减再赋值,
int x=5;
while(x>0)
{
   int y=--x;
System.out.println(y);
}
回复 使用道具 举报
本帖最后由 tongdu_simon 于 2012-5-3 23:29 编辑

自己写段代码测试如下:

反编译的字节码反映出来的实现方式就是:在栈中将x减1。

当然如果楼主要问-1在JVM中是如何表示的,或者减1的实现方式;似乎提的问题容易误导答题者。

p.s.在java version "1.7.0_03"中,用javap -c 命令反编译的
回复 使用道具 举报
tongdu_simon 发表于 2012-5-3 23:19
自己写段代码测试如下:

反编译的字节码反映出来的实现方式就是:在栈中将x减1。

呵呵,才看你的最后一行,我的是1.6还保持着老传统的单字节255表示-1
回复 使用道具 举报
了无尘 发表于 2012-5-3 23:31
呵呵,才看你的最后一行,我的是1.6还保持着老传统的单字节255表示-1

刚才在java version "1.6.0_31"下重新反编译了一下,结果还是一样。

除非是javap命令为了提高反编译代码的可读性,而掩盖了操作数的底层表示,
不然应该用16进制或二进制来表示。
回复 使用道具 举报
如果知道CPU中,有多个寄存器起的话,就好理解了。其实可以查看下有关CPU寄存器的资料,再查下JAVA运算原理,应该就知道了。
回复 使用道具 举报
真好玩
1来报个点老刘快点再加提示  。。给大家 点动力 嘛
回复 使用道具 举报
tongdu_simon 发表于 2012-5-3 23:48
刚才在java version "1.6.0_31"下重新反编译了一下,结果还是一样。

除非是javap命令为了提高反编译代码 ...

我这边的字节码是
164 sipush 355 (int)
167 istore_2
168 iinc LV-2 by 255

昨天我们也讨论了下,应该是以单字节补码型式表示-1,也就是说低8位+255这种的,而不是-1。
计算机本身并没有减法运算,减法也是拿加法算的,所以+255比-1更有说服力。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马