Ubah angka positif menjadi negatif dalam C #


142

Anda dapat mengonversi angka negatif ke positif seperti ini:

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

Apakah ada metode yang setara untuk membuat angka positif menjadi negatif?



3
280Z28: Itu setara dengan myInt = -1.
rekursif

1
harus menjadi myInt | = int.MinValue;
Charles Bretana

@ 280Z28: Itu hanya bekerja untuk angka ganjil, kalau tidak sama dengan membuat angka negatif, dan kemudian mengurangi 1.
Cecil Memiliki Nama

3
Untuk kejelasan kode, saya tidak berpikir Anda harus menggunakan System.Math.Abs ​​() jika Anda hanya ingin "mengubah angka negatif menjadi positif". Secara matematis, bukan itu Nilai Absolut itu, meskipun Anda mendapatkan hasil yang diinginkan. Bergantung pada konteks algoritmik Anda, Anda harus menggunakan solusi yang Anda terima di bawah ini untuk beralih dari negatif ke positif juga.
Chris Dwyer

Jawaban:


452

Bagaimana tentang

myInt = myInt * -1


55
Solusi ini sangat bagus karena dapat juga mengkonversi negatif ke positif! Jenius!
Will Eddins

19
Saya berada di bawah kesan Anda hanya bisa menempelkan "-" di depan apa pun untuk meniadakannya ... -saya ini akan menjadi negatif dari nilai di sayaSaya ... -ABS (myInt) akan menjadi negatif yang dijamin.
DataDink

12
bagaimana myInt = - Myint?
kokbira

9
atau bahkan lebih pendek myInt *= - 1?
nawfal

FYI jika Anda mencoba metode kokbira dengan short, myShort = (short) -myShortpemeran diperlukan karena short menjadi int ketika dinegasi.
AaronLS

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

29
+1 untuk mengingat bahwa jika sudah negatif Anda akan memiliki efek sebaliknya. Jawaban Anda adalah satu-satunya yang akan selalu memberikan angka negatif terlepas dari apakah nomor saya positif atau negatif.
David

Hanya 26 suara untuk jawaban ini? Apakah ada pengguna SO yang berpikir ini tidak akan berhasil?
MusiGenesis

6
30 suara? Sudah pertanyaannya sangat sederhana. Dan jawaban yang terlalu rumit ini (-System.Math.Abs ​​(myNumber) juga akan melakukannya) mendapat 30 suara ????
mmmmmmmm

4
@Revevens semua orang yang secara kolaboratif mencoba menunjukkan jawaban ini jauh lebih benar daripada yang diterima. Juga, - vs * -1 jelas bukan "terlalu rumit".
Rex M

4
Saya suka jawaban ini lebih baik daripada -System.Math.Abs ​​satu, karena sedikit lebih jelas sekilas apa yang terjadi ... Saya pikir akan sedikit lebih mudah untuk melewatkan "-" di depan pernyataan itu.
Beska

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

11
Ya, karena negasi adalah tujuannya, jadi minus unary adalah operator yang tepat. Di sisi lain, mengalikan dengan yang negatif hanyalah trik untuk meniadakan nilai.
Steven Sudit

38
Ini tipuan karena ia mengandalkan efek samping, bukan efek utama. Efek utama minus unary adalah meniadakan. Efek utama dari perkalian adalah mengalikan. Kebetulan bahwa mengalikan dengan -1 meniadakan. Apakah itu lebih jelas?
Steven Sudit

5
@StevenSudit Tidak, tidak lebih baik dari * -1. Mengalikan dengan -1 bukanlah "tipuan" itu adalah cara matematika untuk mengubah angka negatif. -Jumlah hanyalah singkatan dari -1 * Number. Selain itu, menggunakan Abs untuk menjaga agar angka negatif tetap berlebihan. myInt<0 ? myInt : -myInt;jauh lebih baik. Hanya karena - operator disediakan sebagai kependekan dari -1 * * yang tepat ditambah kemampuan kelebihan beban, tidak membuat * (-1) trik.
ThunderGr

93

Cara yang sama Anda membuat hal lain menjadi negatif: letakkan tanda negatif di depannya.

var positive = 6;
var negative = -positive;

8
Semua orang lupa minus unary.
rekursif

Whats perbedaan praktis antara ini dan jawaban ini: stackoverflow.com/questions/1348080/… int myNegInt = System.Math.Abs(myNumber) * (-1);
goodguys_activate

@ makerofthings7, yang Anda tautkan adalah lebih banyak instruksi CPU - operasi bernilai absolut (setidaknya tiga instruksi pada x86), diikuti oleh MUL (atau mungkin NEG jika kompiler pintar). Jawaban ini adalah opcode NEG tunggal dan ringan, tidak lebih atau kurang dari yang Anda butuhkan. Tentu saja, kedua jawaban tersebut berperilaku berbeda ketika nomor input sudah negatif; jika (tidak seperti pertanyaan ini) input Anda mungkin negatif, itu membuat keputusan untuk Anda.
Joe White

41

Catatan untuk semua orang yang merespons

- Math.Abs(myInteger)

atau

0 - Math.Abs(myInteger)

atau

Math.Abs(myInteger) * -1

sebagai cara untuk menjaga angka negatif tetap negatif dan berubah menjadi negatif.

Pendekatan ini memiliki satu kelemahan. Ini tidak berfungsi untuk semua bilangan bulat. Kisaran Int32jenisnya dari "-2 31 " hingga "2 31 - 1." Ini berarti ada satu lagi angka "negatif". Akibatnya, Math.Abs(int.MinValue)melempar OverflowException.

Cara yang benar adalah dengan menggunakan pernyataan kondisional:

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

Pendekatan ini berfungsi untuk bilangan bulat "semua".


Saya akan melemparkan Anda titik untuk kebenaran, tetapi kode apa pun yang bergantung pada tidak ada yang mengambil Abs of MinValue rapuh.
Steven Sudit

Steven: Terkadang, Anda memecahkan masalah (seperti Abs) yang tidak mungkin berhasil int.MinValue(dengan asumsi inttipe pengembalian.) Dalam hal itu, sama sekali tidak masalah untuk melempar pengecualian. Namun, masalah khusus ini memiliki hasil "valid" untuk int.MinValuetetapi melempar pengecualian jika Anda mengambil Absrute.
Mehrdad Afshari

Setelah mengatakan bahwa skala negatif lebih besar daripada positif, Anda kemudian pergi dan menyarankan kode yang tidak menjelaskan ini. Jika nadalah -32768kemudian -nadalah JUGA -32768!!! Terlebih lagi int neg = n < 0 ? n : -n;tidak mungkin bekerja dalam semua kasus, karena salah satu terner tidak melakukan apa pun.
Clive Galway

20

Cara mudah:

myInt *= -1;

1
Akan memposting yang sama, semua orang harus menunjukkan * = beberapa cinta :-)
Brian Scott

16
int negInt = 0 - myInt;

Atau dijamin negatif.

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

11

Untuk mengganti tanda integer, Anda cukup menggunakan operator tanda:

myInt = -myInt;

Untuk membuatnya negatif terlepas dari apakah nilai aslinya negatif atau tidak, Anda terlebih dahulu menggunakan metode Abs:

myInt = -Math.Abs(myInt);

6

Hanya untuk lebih bersenang-senang:

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
Terlalu berisiko, IMHO. Bagaimana jika definisi lingkaran berubah?
MusiGenesis

6

EDIT: Ini salah untuk input positif ... Saya membuat kesalahan dengan lupa bahwa sisa bit di -x (nilai 2s-Complement) adalah 'kebalikan' dari nilai mereka di + x, tidak sama. JADI cukup mengubah bit tanda TIDAK akan bekerja untuk angka positif.

Saya akan meninggalkan ini di sini untuk keperluan ...

Atau cara yang rumit (saya pikir) ...

int y = x | ~ int.MaxValue;

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

begitu

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

dan karena itu setiap int32 Or'ed dengan itu akan menempatkan 1 di bit tanda, (membuatnya negatif), dan meninggalkan semua bit lainnya sama ...

SUNTING: sebenarnya, Karena 1000 0000 0000 0000 0000 0000 0000 0000 sebenarnya adalah Minvalue, ini juga harus berfungsi:

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

Jadi, nol negatif sama dengan int.MinValue?
rekursif

Tidak, dalam dua pasangan komplemen, tidak ada nol negatif. semua yang negatif 1. A 8Bit Int ditandatangani: 10000000 adalah -128
Charles Bretana

1
Memberi +1 karena tidak ada yang layak diturunkan untuk menjawab pertanyaan seperti "huruf apa yang muncul setelah A tetapi sebelum C?"
MusiGenesis

... dan, terima kasih atas jawaban @ Mehrad di bawah ini, Ini adalah satu-satunya pendekatan yang berfungsi ketika input int.MinValue ...
Charles Bretana

Charles: Ini salah. Untuk bilangan negatif, ia berfungsi tetapi untuk bilangan positif, hanya membalik sedikit saja tidak membuat tanda -number. 1semua nol dan satu. Atau dengan itu int.MinValueakan menghasilkan 1000000000000000000000000000000001 yang tidak sama dengan -1(semuanya).
Mehrdad Afshari

6

Meskipun saya jauh terlambat ke pesta di sini, saya akan berpadu dengan beberapa trik berguna dari hari-hari perangkat keras saya. Semua ini menganggap representasi pujian 2 untuk nomor yang ditandatangani.

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

Mau jelaskan ini? dengan i == int.MinValue, maka semua variabel-2147483648
Clive Galway

5

Hanya untuk bersenang-senang:

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

Pembaruan : keindahan dari pendekatan ini adalah Anda dapat dengan mudah mengubahnya menjadi generator pengecualian:

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

5

saya menggunakan myInt = -myInt;

Sangat sederhana dan mudah

Kalau mau hanya positif

myInt = myInt>0 ? myInt : -myInt;

Saya mencari jawaban ini dalam situasi yang sedikit berbeda dengan OP. Saya ingin memiliki 2 nilai yang meniadakan satu sama lain jika salah satunya adalah -5 yang lain harus 5, oleh karena itu ini adalah solusi terbaik saya = D
Mathieu Brouwers

Anda akan mendapatkan kelebihan karena int.MaxValueitu 2147483647, bahkan var i = int.MaxValue; i++;tidak akan berhasil
CMS

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

Tidak ada yang mengatakan itu pasti angka negatif tertentu .


Um, jika Anda tidak peduli bahwa itu harus berupa angka negatif tertentu , Anda dapat menyederhanakan ini menjadi "long negativeNumber = -1;"
Beska

@ Guffa: itu lelucon di sini, sebenarnya.
MusiGenesis




0

Mengonversi angka dari positif ke negatif, atau negatif ke positif:

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

0

Hanya sesuatu yang ingin saya bagikan.

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

Seperti yang disebutkan sebelumnya, hanya mengalikan dengan -1 tidak keren, seperti int.MinValue * -1 == int.MinValue

Ini benar-benar tergantung pada aplikasi Anda, tetapi untuk aplikasi saya (Inverting Joystick axes) Saya ingin memastikan bahwa semua ekstrem masih dapat dijangkau, dan mempertahankan kesetiaan sebanyak mungkin.
Untuk tujuan ini, saya memetakan Max <--> Min dan semua yang ada di * -1
dalamnya mendapat a Menggunakan teknik ini, -32767 tidak dapat dijangkau saat membalikkan.

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


Pembalikan ke 5tidak -5, tapi 1/5.
dafie

-2

Gunakan biner dan untuk menghapus bit terakhir yang bertanggung jawab untuk tanda negatif.

Atau gunakan biner atau untuk menambahkan tanda ke tipe data.

Soln ini mungkin terdengar absurd dan tidak lengkap tetapi saya dapat menjamin ini adalah metode tercepat.

Jika Anda tidak bereksperimen dengan apa yang saya poskan posting ini mungkin terlihat omong kosong: D

Misalnya untuk int:

Int adalah datatype 32 bit sehingga bit terakhir (32th) menentukan tanda.

Dan dengan nilai yang memiliki 0 di 32 tempat dan sisanya 1. Ini akan mengkonversi negatif menjadi + ve.

Untuk kebalikannya atau dengan nilai dengan 1 di tempat ke-32 dan istirahat 0.


-3

X=*-1mungkin tidak bekerja pada semua kompiler ... karena ia membaca 'multiply' 'SUBTRACT' 1 bukannya NEGATIF ​​Alt yang lebih baik adalah X=(0-X), [YANG BERBEDA DARI X-=X]

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.