こんにちは,くぬぎざです.
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