C#で正の数を負の数に変換する


142

次のようにして、負の数を正の数に変換できます。

int myInt = System.Math.Abs(-5);

正の数を負にする同等の方法はありますか?



3
280Z28:これはmyInt = -1と同等です。
再帰

1
myInt | = int.MinValueである必要があります。
Charles Bretana、2009

280Z28 @:それは唯一それ以外の場合は数の負を作り、その後、1を減算と同じだが、奇数のために働く
セシルは、名前持って

3
コードをわかりやすくするために、単に「負の数を正の数に変換する」場合は、System.Math.Abs​​()を使用するべきではないと思います。数学的には、望ましい結果が得られても、それは絶対値ではありません。アルゴリズムのコンテキストに応じて、以下から受け入れたソリューションを使用して、ネガティブからポジティブに移行することもできます。
Chris Dwyer、

回答:


452

いかがですか

myInt = myInt * -1


55
このソリューションは、ネガティブをポジティブにも変換できるので素晴らしいです!天才!
Eddinsが

19
私はあなたが単にそれを否定するために何かの前に単に "-"を付けることができるという印象の下にありました... -myIntこれはmyIntの値の負です... -ABS(myInt)は恐怖の負になります。
DataDink 2009

12
どうmyInt = - Myintですか?
kokbira 2012

9
またはさらに短いmyInt *= - 1ですか?
nawfal 2013年

ちなみにコクビラのメソッドをショートで試してみるmyShort = (short) -myShortと、ネゲートするとショートになるのでintになるのでキャストが必要です。
AaronLS 2013年

236
int myNegInt = System.Math.Abs(myNumber) * (-1);

29
+1は、それがすでにネガティブである場合、反対の効果があることを思い出してください。あなたの答えは、myNumberが正か負かにかかわらず、常に負の数を与える唯一の答えです。
デビッド

この回答には26票しかありませんか?これが機能しないと思うSOユーザーはいますか?
MusiGenesis 2009

6
賛成30票?すでに質問はとても簡単です。そして、この過度に複雑な答え(-System.Math.Abs​​(myNumber)も同様です)は30票を獲得しますか????
mmmmmmmm

4
@rstevens全員が協力してこの回答を示そうとすると、受け入れられた回答よりもはるかに正確です。また、-vs * -1は「過度に複雑」ではありません。
レックスM

4
-System.Math.Abs​​の答えよりもこの答えの方が好きです。何が起こっているのかが一目でわかるので...ステートメントの前にある "-"を見落とす方が少し簡単だと思います。
Beska、

132
int negInt = -System.Math.Abs(myInt)

11
はい、否定が目的なので、単項マイナスが正しい演算子です。一方、負の値を掛けることは、単に値を否定するトリックです。
Steven Sudit、2009

38
主要な効果ではなく、副作用に依存するため、これはトリックです。単項マイナスの主な効果は否定することです。乗算の主な効果は乗算です。たまたま、-1を掛けると負になります。それはより明確ですか?
Steven Sudit、2009

5
@StevenSuditいいえ、* -1よりも良くありません。-1を掛けることは「トリック」ではなく、数値を負にする数学的方法です。-Numberは-1 * Numberの省略形です。さらに、数値を負に保つためにAbsを使用することは過剰です。myInt<0 ? myInt : -myInt;はるかに優れています。-演算子が適切な-1 * Numberとオーバーロード機能の省略形として提供されているからといって、*(-1)がトリックになるわけではありません。
ThunderGr 2014年

93

他の何かを否定的にするのと同じ方法:その前に否定的な記号を置きます。

var positive = 6;
var negative = -positive;

8
誰もが単項マイナスを忘れています。
再帰的

これとこの答えの実際的な違いは int myNegInt = System.Math.Abs(myNumber) * (-1);
何ですか

@ makerofthings7、あなたがリンクしたものは、はるかに多くのCPU命令-絶対値演算(x86では少なくとも3つの命令)、それに続くMUL(またはコンパイラーが賢い場合はNEG)です。この答えは、単一の軽量NEGオペコードであり、必要なものとほぼ同じです。もちろん、入力値がすでに負の場合、2つの答えは異なる動作をします。(この質問とは異なり)あなたの入力が否定的であるかもしれないならば、それはあなたのために決定をします。
ジョーホワイト

41

と答えたすべての人に注意してください

- Math.Abs(myInteger)

または

0 - Math.Abs(myInteger)

または

Math.Abs(myInteger) * -1

負の数を負に保ち、正の数を負にする方法として。

このアプローチには1つの欠点があります。すべての整数に対して機能するわけではありません。範囲Int32タイプ「は-2からなる31」2「31 - 1」これは、「負の」数がもう1つあることを意味します。その結果、がMath.Abs(int.MinValue)スローされますOverflowException

正しい方法は、条件ステートメントを使用することです。

int neg = n < 0 ? n : -n;

このアプローチは、「すべての」整数に対して機能します。


正確さのために要点を説明しますが、MinValueの絶対値を取る人がいないことに依存するコードは脆弱です。
Steven Sudit、2009

スティーブン:場合Absによっては、int.MinValueint戻り値の型を想定して)うまくいかない可能性のある問題(など)を解決していることがあります。その場合、例外をスローしてもまったく問題ありません。ただし、この特定の問題には「有効な」結果int.MinValueがありますが、Absルートをたどると例外がスローされます。
Mehrdad Afshari、

負のスケールが正のスケールよりも大きいと言ったら、次に、これを考慮しないコードを提案します。もしそうならn-32768それ-nもまた-32768!!! さらにint neg = n < 0 ? n : -n;、3成分の1つがまったく何もしないため、すべてのケースで機能する可能性はありません。
クライヴゴールウェイ


16
int negInt = 0 - myInt;

または負であることが保証されています。

int negInt = -System.Math.Abs(someInt);

11

整数の符号を切り替えるには、符号演算子を使用するだけです。

myInt = -myInt;

元の値が負かどうかに関係なく負にするには、最初にAbsメソッドを使用します。

myInt = -Math.Abs(myInt);

6

もっと楽しくするために:

int myInt = Math.Min(hisInt, -hisInt);

int myInt = -(int)Math.Sqrt(Math.Pow(Math.Sin(1), 2) + Math.Pow(Math.Cos(-1), 2))
            * Math.Abs(hisInt);

2
危険すぎる、私見。円の定義が変わった場合はどうなりますか?
MusiGenesis 2009

6

編集:これは正の入力では間違っています... -x(2s-補数値)の残りのビットは+ xの値の「反対」であり、同じではないことを忘れてしまいました。SO符号ビットを変更するだけでは、正の数では機能しません。

目的のためにここに置いておきます...

またはトリッキーな方法(私は思う)...

int y = x | 〜int.MaxValue;

cause int.MaxValue is 0111 1111 1111 1111 1111 1111 1111 1111

そう

~int.MaxValue is      1000 0000 0000 0000 0000 0000 0000 0000

したがって、int32 Or'edを使用すると、符号ビットが1になり(負になる)、他のすべてのビットは同じままになります...

編集:実際には、1000 0000 0000 0000 0000 0000 0000 0000は実際には最小値なので、これも機能するはずです:

   int y = x | int.MinValue; // or, to do it to itself,
   x |= int.MinValue;

したがって、負のゼロはint.MinValueと等しくなりますか?
再帰

いいえ、2の補数では、負のゼロはありません。すべて1は負の1です。符号付き8ビット整数:10000000は-128
Charles Bretana 09

1
+1「Aの後で、Cの前に来る文字は何か」のような質問に答えるに値する人はいないので、+ 1してください。
MusiGenesis 2009

...と、以下のMehradの答え@のおかげで、これは作品の入力がint.MinValueある...ということだけなアプローチである
チャールズBretana

チャールズ:これは間違っています。負の数の場合は機能しますが、正の数の場合は、符号ビットを反転するだけでは効果がありません-number1すべてゼロと1です。それをか-INGのint.MinValueと同じではありません10000000000000000000000000000001なります-1(すべてのものを。)
Mehrdad Afshari

6

ここのパーティーにはかなり遅れましたが、ハードウェア時代の便利なトリックをいくつか紹介します。これらはすべて、2の符号付き数の補数表現を前提としています。

int negate = ~i+1;
int positiveMagnitude = (i ^ (i>>31)) - (i>>31);
int negativeMagnitude = (i>>31) - (i ^ (i>>31));

これをもっと詳しく説明しますか?withを使用するとi == int.MinValue、すべての変数は-2147483648
Clive Galway

5

ちょうど楽しみのために:

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "-", positiveInt.ToString()));

更新:このアプローチの優れた点は、例外ジェネレーターに簡単にリファクタリングできることです。

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "thisisthedumbestquestioninstackoverflowhistory", positiveInt.ToString()));

5

私が使う myInt = -myInt;

とてもシンプルで簡単

ポジティブにしたいなら

myInt = myInt>0 ? myInt : -myInt;

OPとは少し異なる状況でこの答えを探していました。2つの値のうちの1つが-5で、もう1つが5である場合、お互いを否定したいので、これが私の最良の解決策です= D
Mathieu Brouwers

あなたは以来、オーバーフローになるだろうint.MaxValue2147483647、でもvar i = int.MaxValue; i++;文句を言わない仕事
CMS

4
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);

特定の負の数である必要があるとは誰も言っていません。


ええと、特定の負の数である必要がないことを気にしなければ、これを "long negativeNumber = -1;"に簡略化できます。
Beska、

@Guffa:実際のところ、これは冗談です。
MusiGenesis 2011年




0

数値を正から負、または負から正に変換する:

public static decimal Reverse(this decimal source)
{
     return source * decimal.MinusOne;
}

0

共有したいものだけです。

public decimal NumberReevaluate(decimal number, bool isPositive)
{
    var tempNumber = System.Math.Abs(number);
    return isPositive ? tempNumber : -tempNumber;
}

1
number >= 0 == isPositive ? number : -number
Vitaliy

0

前述のように、-1を乗算するだけではクールではありません。 int.MinValue * -1 == int.MinValue

それは本当にあなたのアプリケーションに依存しますが、私の場合(ジョイスティックの軸の反転)すべての極値が到達可能であることを確認し、できるだけ多くの忠実度を維持したいと思います。
この目的のために、私はMax <-> Minをマップし、その間のすべてがを取得し* -1
ます。この手法を使用すると、反転時に-32767に到達できません。

private static int Invert(int value) { if (value == int.MaxValue) return int.MinValue; if (value == int.MinValue) return int.MaxValue; return value * -1; }


への反転5はありません-51/5
dafie

-2

バイナリとを使用して、負の符号の原因である最後のビットを削除します。

または、バイナリまたはを使用して、データ型に符号を追加します。

この解決策は不合理で不完全に聞こえるかもしれませんが、これが最速の方法であることを保証できます。

あなたが私がこの投稿を投稿したことを実験しないと、がらくたに見えるかもしれません:D

例:int:

Intは32ビットのデータ型なので、最後のビット(32番目)が符号を決定します。

そして、32の場所に0があり、残りが1である値を使用します。負のnoを+ veに変換します。

正反対の場合、または32位に1の値を持ち、残りが0の場合。


-3

X=*-1それは代わりにNEGATIVEの「乗算」「SUBTRACT 1」を読み込むため、すべてのコンパイラの仕事ではないことがあります...より良いALTがあるX=(0-X)[FROM DIFFされています、X-=X]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.