[H8-ML(1612)] Re: unsigned->double型変換
From: Junsuke Kunugiza <jk@xxxxxxx>
Date: 2002年02月25日(月)14時06分47秒
こんにちは,くぬぎざです.

On Mon, 25 Feb 2002 12:28:29 +0900
Katsushi MATSUBAYASHI <matsu@xxxxxxxxxxxxxx> wrote:

> これは,ANCIの仕様でしょうか。

仕様と言えば,仕様です.

仕様では,単項の - 演算子は,代入の = 演算子よりも優先順位が
高いとされているため,y=-x; という式は,1) x の符号が反転し,
2) 1 の結果が y に代入されるという順序で評価されます.

すなわち,1) の段階で unsigned int として宣言されている x が
無理やり負数にされてしまっているため,当然の帰結としておかしな
結果となるわけです.

y=-x; という演算を意図した通りにやるには,x を unsigned では
ない int として宣言するか,式において y=-(int)x; というふうに
int のキャストを付け,= の右辺を,負数をも扱いうる実数型として
処理されるようにしておく必要があります.


/* キャストを付けた例 */

#include <stdio.h>

main()
{
    unsigned x=10;
    double y;
    int z;
    y=-(int)x;
    z=-x;
    printf("%lf\n",y);
    printf("%d",z);
}


ちなみに,4294967286 という数字の秘密は・・
1) 0x0A の符号を反転 -> 32bit なら 0xFFFFFFF6 になる
2) 正数としての 0xFFFFFFF6 は,10進で表記すると 4294967286 である


椚座 淳介 (Junsuke Kunugiza)
E-Mail: jk@xxxxxxx

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


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


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