ページ 1 / 1
悩みというか、雑談というか
Posted: 2010年3月16日(火) 19:48
by dic
C言語に限った話ではないのですが、
-2、-1、0、1、2
と普通は なっていますが
この間に -0(マイナスゼロ)はないだろうかと考え
-0の2の補数を数えると
0を2進数で
0000(2)
これを全部ビット反転して
1111(2)
これに1を加えて
10000(2)
となり、桁がはみ出たので
0000(2)
となって無事マイナスゼロが成立したので
0 = -0 と考えていいのでしょうか?
大学には進学してないので、そこまではわからないのです
Re:悩みというか、雑談というか
Posted: 2010年3月16日(火) 23:05
by Poco
ん~、考えていいと思います。
-0=(-1)×0なんで。
Re:悩みというか、雑談というか
Posted: 2010年3月16日(火) 23:06
by たいちう
厳密な証明は「群論」の範囲だと思います(あるいは群論をかじると判りやすい)。
有限の範囲を持つ自然数の集合を定義し、それらに対する「加算」や
「2の補数」という演算を定義した上で、0 = -0 を証明できます。
私もちゃんと勉強したことはないけど、できるはずです。
次に上記の定義をビットで表現すれば、腑に落ちるのではないでしょうか。
Re:悩みというか、雑談というか
Posted: 2010年3月16日(火) 23:30
by たかぎ
CやC++の場合でいえば、負の整数値の内部表現に、1の補数や符号ビットと絶対値を用いている処理系では-0があり得ます。
ただし、1の補数表現で全ビットが1の場合や、2の補数表現や符号ビットと絶対値表現で符号ビットが1で値ビットがすべて0の場合がトラップ表現かどうかは処理系定義です。
したがって、1の補数や符号ビットと絶対値を内部表現として用いている場合でも、常に-0が存在するとは限りません。
なお、浮動小数点数の場合は、符号ビットと絶対値表現を用いていますので、-0が存在するのが普通です。
Re:悩みというか、雑談というか
Posted: 2010年3月17日(水) 16:54
by dic
>群論
はじめて聞きました
・・・老後の楽しみにしておきます
今から勉強しても間に合わないでしょうし
整数の場合しか考えていませんでした
浮動小終点の場合も考えないといけなかったですね
勉強になりました
ありがとうございました