2017-08-21 8 views
-1

次のプログラムでは、float可変印刷負のゼロです。"int"変数が負のゼロを出力しないのはなぜですか?

//g++ 5.4.0 

#include <iostream> 

int main() 
{ 
    float val = 0; 
    val = -val; 

    std::cout<<val<<std::endl; 
} 

出力:

-0 

しかし、次のコードで

//g++ 5.4.0 

#include <iostream> 

int main() 
{ 
    int val = 0; 
    val = -val; 

    std::cout<<val<<std::endl; 
} 

出力:

0 

は正のゼロを印字します。

なぜint変数に負のゼロが印刷されないのですか?

+4

あなたのシステムの整数表現に負のゼロがないので、誰が負のゼロがあるべきだと言ったのですか? – StoryTeller

+1

intsは、通常の表現で負のゼロを持たず、1にはあまり使用されません。 – user2357112

+1

@StoryTellerなぜ答え​​を投稿しませんか?コメントは答えとすべてのものではない... – juanchopanza

答えて

4

普通のコンピュータで負の整数を扱う方法は、two's complementを使用してそれらをエンコードすることです。 2の補数を使うと、負のゼロを持つことはできません。

+2

C++標準は2の補数を必要としないのでそこでは負のゼロの整数で実装することができます。 – juanchopanza

+2

私は実際の世界、整数のためにそれを使用する非古典的なプラットフォームを知らないけれども、特にサインとマグニチュードの表現が心に浮かびます。一般的に、私は野生の非2の補数符号付き整数実装を見つけるのは難しいでしょう。 –

2

浮動小数点数は、符号、指数、および分数で構成されます。符号が1の場合、符号は負で、符号は0、正の数です。

数は最上位ビット1を持っている場合、あなたは2の補数から、それを変換する必要がありますので、コンピュータでの負の数は、通常、twos complementによって処理されますが、あなたが

enter image description here


下の例に見ることができるように本当の価値を得る。例えば8ビットである。

+---+---+---+---+---+---+---+---+ 
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 
+---+---+---+---+---+---+---+---+ 

第1工程:ビット

+---+---+---+---+---+---+---+---+ 
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 
+---+---+---+---+---+---+---+---+ 

第2工程をリバース:1

+---+---+---+---+---+---+---+---+ 
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 
+---+---+---+---+---+---+---+---+ 

に第三ステップを追加します:変更記号

だから、結果は-128です。

つまり、-0を2の補数で使用することはできません。

8

数学的整数のセットに負のゼロというものはありません。

ほとんど使用されていない整数の機械表現には、複数のゼロ表現があります。この場合、そのうちの1つは通常「負のゼロ」と呼ばれます。ただし、C++言語では、通常の整数APIを使用してそのような表現をプログラマに公開することはできません。だからあなたのコンピュータがそうした表現を持っていても、それはおそらくそうではないでしょうが、それは-0として出力されません。

一方、浮動小数点数の最も一般的な表現はゼロに符号が付けられており、C++標準では具体的にはプログラマに符号を公開する実装が可能です。

+0

この美しい答えはより多くのupvotesを持っているはずです。別のものを持ってください。 – Bathsheba

+0

関連:[1を補完するシステムでstd :: coutは負のゼロをどのように出力するのですか?](https://stackoverflow.com/q/33151068/5470596)そしてそうです。 – YSC

1

これは、intとfloatのバイナリ表現が互いに異なるためです。

intは32ビットで構成され、最も重要なものが符号ビットです。符号ビットが真であるときのintの最大可能値は、11111111111111111111111111111111です。これは-1です。したがって、負のゼロは不可能です。

符号付き浮動小数点数は、符号、指数、および仮数(小数点)の3つの部分に分割されます。したがって、端数部分がゼロに等しい場合、整数はゼロに等しい。符号ビット(これは本質的にはval = -valで行ったことです)を切り替えると、数字は技術的にはまだゼロですが、coutにその数字を10進数の文字列に変換するように指示すると、それは符号ビット1に設定され、その冒頭にマイナス記号がスローされます。私は意味があることを願っています

関連する問題