hamayan です。
詳しい理由はC言語の構文に詳しい方に譲って
Katsushi> 下のプログラムを秋月のCコンパイラ/H8マザーキットで,
Katsushi> 実行するとyが正の数になってしまい,一晩悩みました。
Katsushi> unsigned x=10;
Katsushi> double y;
Katsushi> int z;
Katsushi> y=-x;
Katsushi> z=-x;
符号無しxに10を代入しそれを符号付きyに代入している所で問題が有るようです。
手元のSH2のLIST出力では上記をコンパイルすると
sample.c 127 unsigned x = 10;
sample.c 128 double y;
sample.c 129 int z;
sample.c 130 y = -x;
0000017C D230 MOV.L L496+18,R2 ; H'41EFFFFF
0000017E 63F3 MOV R15,R3
sample.c 131 z = -x;
sample.c 132 sprintf( dec_buf_y, "%lf\n", y );
00000180 D432 MOV.L L496+30,R4 ; _dec_buf_y
00000182 2322 MOV.L R2,@R3
00000184 D22F MOV.L L496+22,R2 ; H'FEC00000
となってしまい、なんと10をH'41EFFFFFFEC00000に変換しています。手元の電卓では計算できませんでした。
これをyに代入する時に
y = -(double)x;
とすれば
sample.c 127 unsigned x = 10;
sample.c 128 double y;
sample.c 129 int z;
sample.c 130 y = -(double)x;
0000017C D230 MOV.L L496+18,R2 ; H'C0240000
0000017E 63F3 MOV R15,R3
sample.c 131 z = -x;
sample.c 132 sprintf( dec_buf_y, "%lf\n", y );
00000180 D431 MOV.L L496+26,R4 ; _dec_buf_y
00000182 2322 MOV.L R2,@R3
00000184 E200 MOV #0,R2
でH'C024000000000000と正しく-10となっています。
符号無し変数から符号付きまたはその逆に代入を行う時は気を付けた方が良いと言う事ですね。
ちなみに最適化が行われているので127から129までの3行はコードに変換されていませんね。
C言語の詳しい方是非解説お願いします。
------------------------------------------------------------
)^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^(
☆☆☆☆☆☆☆☆☆☆☆☆designed by hamayan☆☆☆☆☆☆☆☆☆
from はまやん
アドレスは
hamayan@xxxxxxxxxxxxxxxx
FILEを添付される場合は
hamayan@xxxxxxxxxxxxxxx
★★★★★★★★★end of message and thank you★★★★★★★