すみません。キャストとか何も考えずにですが、頭まとまってないままレス書いてます。

int i = 2;
System.out.println(++i);
の場合
0 : iconst_2   //int型の2をオペランドスタックにpush
1 : istore_1   //ローカル変数領域の1番目に2を格納(0番目は違うデータ)
2 : getstatic #16 //System.out.PrintStream
5 : iinc 1, 1   //1番目のローカル変数(ここではi(=2))を1インクリメントする
8 : iload_1    //ローカル変数 i をオペランドスタックへpushする
9 : invokevirtual #22 //println実行


int i = 2;
System.out.println(i++);
の場合
0 : iconst_2
1 : istore_1
2 : getstatic #16
5 : iload_1      //ローカル変数 i をオペランドスタックへpushする
6 : iinc 1, 1     //1番目のローカル変数(ここではi(=2))を1インクリメントする
9 : invokevirtual #22

これだと、
++i の場合、ローカル変数領域でインクリメントした値をオペランドスタックにプッシュしてprintlnしている。
i++ の場合、iをオペランドスタックにプッシュした後、ローカル変数領域でインクリメントしている。

つまり、printlnで出力される値はオペランドスタック内での値で、インクリメントされるのはローカル変数領域の値。
ローカル変数領域の値をインクリメント前後のどっちのタイミングで取り出すかで結果が違った。

これでいいんでしょうか?