[H8-ML(1611)] Re: unsigned->double 型変換
From: hamayan <hamayan@xxxxxxxxxxxxxxx>
Date: 2002年02月25日(月)13時57分40秒
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★★★★★★★

スレッド概略
[1610(R)](起点)
 └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]