Pozitif bir sayıyı C # 'da negatife dönüştürme


142

Negatif bir sayıyı aşağıdaki gibi pozitif hale dönüştürebilirsiniz:

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

Pozitif bir sayıyı negatif yapmak için eşdeğer bir yöntem var mı?



3
280Z28: Bu, myInt = -1'e eşdeğerdir.
özyinelemeli

1
myInt | = int.MinValue olmalı;
Charles Bretana

280Z28 @: Bu sadece aksi takdirde numara negatif hale ve sonra 1. çıkarılarak aynıdır, tek sayı için çalışır
Cecil bir ismi Has

3
Kod netliği için, sadece "negatif bir sayıyı pozitif dönüştürmek" istiyorsanız System.Math.Abs ​​() kullanmanız gerektiğini düşünmüyorum. Matematiksel olarak, istenen sonucu alsanız bile Mutlak Değer bu değildir. Algoritmik içeriğinize bağlı olarak, olumsuzdan olumluya gitmek için aşağıda kabul ettiğiniz çözümü de kullanmalısınız.
Chris Dwyer

Yanıtlar:


452

Peki ya

myInt = myInt * -1


55
Bu çözüm harikadır çünkü negatifi de pozitife dönüştürebilir! Genius!
Will Eddins

19
Ben sadece basitçe onu reddetmek için bir şey önünde bir "-" sopa olabilir izlenimi altındaydı ... -myInt Bu myInt ... -ABS (myInt) değeri bir garaunteed negatif olurdu negatif olurdu.
DataDink

12
Ne hakkında myInt = - Myint?
kokbira

9
ya da daha kısa myInt *= - 1?
nawfal

FYI, kokbira'nın yöntemini kısa bir yöntemle denerseniz myShort = (short) -myShort, reddedildiğinde kısa bir int olur.
AaronLS

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

29
Zaten negatif ise, bunun tersi bir etkisinin olacağını hatırlamak için +1. Cevabınız, myNumber'ın pozitif veya negatif olmasına bakılmaksızın, her zaman negatif bir sayı verecek olan tek yanıttır.
David

Bu cevap için sadece 26 oy? Bunun işe yaramayacağını düşünen SO kullanıcıları var mı?
MusiGenesis

6
30 yukarı oy? Zaten soru çok basit. Ve bu aşırı karmaşık cevap (-System.Math.Abs ​​(myNumber) da yapardı) 30 oy alır ????
mmmmmmmm

4
@rstevens, bu cevabın kabul edilen yanıttan çok daha doğru olduğunu belirtmek için işbirliği içinde çalışan herkes. Ayrıca, - vs * -1 kesinlikle "aşırı karmaşık" değildir.
Rex M

4
Bu cevabı -System.Math.Abs ​​birinden daha çok seviyorum, çünkü neler olduğuna bir bakışta biraz daha açık ... Bence ifadenin önündeki "-" karakterini kaçırmak biraz daha kolay olacak.
Beska

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

11
Evet, çünkü olumsuzlama hedeftir, bu nedenle tekli bir eksi doğru operatördür. Öte yandan, negatif olanla çarpmak sadece bir değeri reddetmek için bir numaradır.
Steven Sudit

38
Bu bir hile çünkü birincil etkiye değil, bir yan etkiye güveniyor. Tekli eksi birincil etkisi olumsuzlamaktır. Çarpmanın birincil etkisi çoğalmaktır. Sadece -1 ile çarpma olumsuz olur. Bu daha net mi?
Steven Sudit

5
@StevenSudit Hayır, * -1'den daha güzel değil. -1 ile çarpmak bir numara değil, bir sayıyı negatif çevirmenin matematiksel yoludur. -Numara -1 * Sayı kısayoludur. Ek olarak, sayıyı negatif tutmak için Abs kullanmak aşırıdır. myInt<0 ? myInt : -myInt;daha iyi. - operatörü uygun -1 * Numarası artı aşırı yükleme yetenekleri için bir kısayol olarak sağlandığından * (-1) bir numara yapmaz.
ThunderGr

93

Başka bir şeyi negatif yaptığınız gibi: önüne negatif bir işaret koyun.

var positive = 6;
var negative = -positive;

8
Herkes tekli eksi unutur.
özyinelemeli

Bu ve bu cevap arasındaki pratik fark nedir: stackoverflow.com/questions/1348080/… int myNegInt = System.Math.Abs(myNumber) * (-1);
goodguys_activate

@ makerofthings7, bağlandığınız çok daha fazla CPU talimatları - mutlak değer işlemi (x86'da en az üç talimat ), ardından bir MUL (ya da derleyici akıllısa muhtemelen bir NEG). Bu cevap tek, hafif bir NEG opcode'dur, ihtiyacınız olandan az ya da çok değildir. Tabii ki, giriş sayısı zaten negatif olduğunda iki cevap farklı davranır; (bu sorunun aksine) girdiniz negatif olabilirse, bu sizin için karar verir.
Joe White

41

Yanıt veren herkese not

- Math.Abs(myInteger)

veya

0 - Math.Abs(myInteger)

veya

Math.Abs(myInteger) * -1

negatif sayıları negatif tutmanın ve pozitif sayıları negatif tutmanın bir yolu olarak.

Bu yaklaşımın tek bir kusuru vardır. Tüm tamsayılar için çalışmaz. Int32Tip aralığı "-2 31 " ile "2 31-1 arasındadır ." Bir "negatif" sayı daha var demektir. Sonuç olarak, Math.Abs(int.MinValue)atar OverflowException.

Doğru yol koşullu ifadeleri kullanmaktır:

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

Bu yaklaşım "tümü" tamsayıları için geçerlidir.


Size doğruluk noktasını atacağım, ancak MinValue Abs'i alan hiç kimseye bağlı olmayan herhangi bir kod kırılgandır.
Steven Sudit

Steven: Bazen, Absmuhtemelen işe yaramayacak bir problemi (örneğin ) int.MinValueçözüyorsunuz ( intdönüş türünü varsayarak ). Bu durumda, bir istisna atmak tamamen sorun değildir. Ancak, bu özel sorunun "geçerli" bir sonucu vardır, int.MinValueancak Absrotayı alırsanız bir istisna atar .
Mehrdad Afshari

Negatif ölçeğin pozitif olandan daha büyük olduğunu söyledikten sonra, bunu hesaba katmayan bir kod önerirsiniz. Eğer nbir -32768sonra -nAYRICA olduğunu -32768!!! Ayrıca int neg = n < 0 ? n : -n;, üçlülerden biri kesinlikle hiçbir şey yapmadığından, her durumda çalışamaz.
Clive Galway

20

Kolay yol:

myInt *= -1;

1
Aynı şeyi göndermek üzereydi, herkes * = biraz sevgi göstermelidir :-)
Brian Scott

16
int negInt = 0 - myInt;

Veya negatif olduğu garanti edilir.

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

11

Bir tamsayının işaretini değiştirmek için işaret operatörünü kullanmanız yeterlidir:

myInt = -myInt;

Orijinal değerin negatif olup olmadığına bakılmaksızın negatif yapmak için, önce Abs yöntemini kullanırsınız:

myInt = -Math.Abs(myInt);

6

Daha fazla eğlence için:

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
Çok riskli, IMHO. Bir çemberin tanımı değişirse ne olur?
MusiGenesis

6

DÜZENLEME: Bu pozitif girdiler için yanlış ... -x (2s-Complement değeri) içindeki bitlerin geri kalanının + x cinsinden değerlerinin 'karşı' olduğunu unutmamakla hata yaptım. Yani sadece işaret bitini değiştirmek pozitif sayılar için ÇALIŞMAZ.

Bunu burada amaçlarla terk edeceğim ...

Veya zor yoldan (sanırım) ...

int y = x | ~ İnt.MaxValue;

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

yani

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

ve dolayısıyla herhangi bir int32 Or'ed, işaret bitine 1 ekler, (negatif yapar) ve diğer tüm bitleri aynı bırakır ...

DÜZENLEME: aslında, 1000 0000 0000 0000 0000 0000 0000 0000 0000 aslında Minvalue olduğundan, bu da çalışmalıdır:

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

Yani, negatif sıfır, int.
özyinelemeli

Hayır, iki tamamlayıcıda negatif sıfır yoktur. hepsi negatif 1. A İmzalı 8Bit Int: 10000000 -128
Charles Bretana

1
+1 çünkü kimse "A'dan sonra ama C'den önce hangi harf geliyor?" Gibi bir soruyu cevaplamaktan vazgeçmeyi hak etmiyor.
MusiGenesis

... ve @ Mehrad'ın aşağıdaki cevabı sayesinde, giriş int.Value olduğunda işe yarayan tek yaklaşım bu ...
Charles Bretana

Charles: Bu yanlış. Negatif sayılar için çalışır, ancak pozitif sayılar için, sadece işaret bitini döndürmek yapmaz -number. 1hepsi sıfır ve bir. Ya da int.MinValuebununla sonuçlanması 10000000000000000000000000000001 ile sonuçlanacaktır -1(hepsi).
Mehrdad Afshari

6

Burada partiye çok geç kalmama rağmen, donanım günlerimden bazı faydalı numaralarla karşılaşacağım. Bunların hepsi 2'nin imzalı sayılar için iltifatını varsayar.

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

Bunu daha fazla açıklamak ister misiniz? ile i == int.MinValue, tüm değişkenler-2147483648
Clive Galway

6

kullanırım myInt = -myInt;

Çok basit ve kolay

Eğer sadece pozitif olmak istiyorsanız

myInt = myInt>0 ? myInt : -myInt;

Bu cevabı OP'den biraz farklı bir durumda arıyordum. Bunlardan biri -5 diğeri 5 olmalı, birbirinden olumsuz 2 değer olsun istiyorum, bu nedenle bu benim en iyi çözüm = D
Mathieu Brouwers

int.MaxValueolduğu için 2147483647bile bir taşma alacak , hatta var i = int.MaxValue; i++;alışkanlık
CMS

5

Sadece eğlence için:

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

Güncelleme : Bu yaklaşımın güzelliği, onu bir istisna üreticisine kolayca yeniden aktarabilmenizdir:

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

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

Kimse bunun herhangi bir negatif sayı olması gerektiğini söylemedi .


Um, belirli bir negatif sayı olması gerektiği umurumda değilse, bunu "long negativeNumber = -1;"
Beska

@Guffa: Buradaki şaka aslında.
MusiGenesis




0

Bir sayıyı pozitiften negatife veya negatiften pozitife dönüştürme:

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

0

Sadece paylaşmak istediğim bir şey.

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

Daha önce de belirtildiği gibi, -1 ile çarpmak hoş değildir, int.MinValue * -1 == int.MinValue

Gerçekten uygulamanıza bağlıdır, ancak benim için (Ters Joystick eksenleri) tüm uçlara hala ulaşılabilir olmasını sağlamak ve mümkün olduğunca fazla sadakat sağlamak istiyorum.
Bu amaçla, Max <--> Min ile eşleştiriyorum ve aradaki her şeye bir * -1
Bu teknik kullanılarak, -32767 ters çevrilirken erişilemiyor.

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


Geçiş 5değil -5, ama 1/5.
dafie

-2

İkili ve negatif işaretten sorumlu son bit kaldırmak için kullanın.

Veya bir veri tipine işaret eklemek için ikili veya kullanın.

Bu soluk saçma ve eksik gelebilir, ancak bunun en hızlı yöntem olduğunu garanti edebilirim.

Eğer ben bu yazı gönderdi ne denemiyorsanız bok görünebilir: D

Örneğin int için:

Int 32 bit veri tipidir, bu nedenle son bit (32th) işareti belirler.

Ve 32 yerde 0 ve dinlenme 1 değeri olan bir değer ile.

Tam tersi için ya da 32. sırada 1 olan bir değer ve dinlenme 0 için.


-3

X=*-1tüm derleyiciler üzerinde çalışmayabilir ... NEGATİF yerine 'çarp' 'SUBTRACT' 1 okuduğundan daha iyi alt X=(0-X), [HANGİ FARKLIDIR X-=X]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.