แปลงจำนวนบวกเป็นลบใน C #


142

คุณสามารถแปลงจำนวนลบเป็นค่าบวกดังนี้:

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

มีวิธีการเทียบเท่าที่จะทำให้จำนวนบวกเป็นลบหรือไม่?



3
280Z28: นั่นเท่ากับ myInt = -1
เรียกซ้ำ

1
จะต้องมี myInt | = int.MinValue;
ชาร์ลส์ Bretana

@ 280Z28: มันใช้งานได้กับตัวเลขคี่เท่านั้นไม่เช่นนั้นมันจะเหมือนกับการลบจำนวนแล้วลบ 1
เซซิลมีชื่อ

3
เพื่อความชัดเจนของรหัสฉันไม่คิดว่าคุณควรใช้ System.Math.Abs ​​() ถ้าคุณต้องการเพียงแค่ "แปลงจำนวนลบให้เป็นค่าบวก" ในทางคณิตศาสตร์นั่นไม่ใช่สิ่งที่คุ้มค่าแน่นอนแม้ว่าคุณจะได้รับผลลัพธ์ที่ต้องการ ขึ้นอยู่กับบริบทของอัลกอริทึมของคุณคุณควรใช้โซลูชันที่คุณยอมรับด้านล่างเพื่อไปจากเชิงลบเป็นบวกเช่นกัน
Chris Dwyer

คำตอบ:


452

เกี่ยวกับ

myInt = myInt * -1


55
วิธีนี้ดีมากเพราะมันสามารถแปลงค่าเป็นลบได้! Genius!
Will Eddins

19
ฉันอยู่ภายใต้ความประทับใจที่คุณทำได้เพียงแค่ติด "-" ต่อหน้าอะไรก็ได้เพื่อลบล้างมัน ... -myInt นี่จะเป็นค่าลบใน myInt ...
DataDink

12
แล้วmyInt = - Myintไงล่ะ
kokbira

9
หรือว่าสั้นกว่านี้myInt *= - 1?
nawfal

FYI ถ้าคุณลองใช้วิธีของ kokbira โดยใช้ short, myShort = (short) -myShortcast จำเป็นเพราะ short จะกลายเป็น int เมื่อถูกทำให้ไร้ผล
AaronLS

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

29
+1 สำหรับการจดจำว่าหากเป็นลบอยู่แล้วคุณจะมีผลตรงกันข้าม คำตอบของคุณคือคำตอบเดียวที่จะให้จำนวนลบเสมอโดยไม่คำนึงว่า myNumber เป็นบวกหรือลบ
David

มีเพียง 26 โหวตสำหรับคำตอบนี้? มีผู้ใช้ที่คิดว่าสิ่งนี้ไม่ทำงานหรือไม่
MusiGenesis

6
โหวตขึ้น 30 คะแนน? คำถามนี้ง่ายมาก และคำตอบที่ซับซ้อนเกินกว่านี้ (-System.Math.Abs ​​(myNumber) ก็ทำได้เช่นกัน) ได้รับคะแนนโหวต 30 คะแนน ????
mmmmmmmm

4
@rstevens ทุกคนที่พยายามระบุว่าคำตอบนี้ถูกต้องมากกว่าคำตอบที่ยอมรับ นอกจากนี้ - vs * -1 ไม่แน่นอน "ซับซ้อนเกิน"
Rex M

4
ฉันชอบคำตอบนี้ดีกว่า -System.Math หนึ่งในนั้นเพราะมันค่อนข้างชัดเจนในสิ่งที่เกิดขึ้น ... ฉันคิดว่ามันจะง่ายกว่าเล็กน้อยที่จะพลาด "-" ต่อหน้าคำแถลง
Beska

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

11
ใช่เพราะการปฏิเสธเป็นเป้าหมายดังนั้นเครื่องลบก็เป็นตัวดำเนินการที่ถูกต้อง ในทางกลับกันการคูณด้วยค่าลบจะเป็นเพียงกลลวงเพื่อลบล้างค่า
Steven Sudit

38
มันเป็นกลลวงเพราะมันขึ้นอยู่กับผลข้างเคียงไม่ใช่ผลหลัก ผลกระทบหลักของเอกภาพลบคือการปฏิเสธ ผลหลักของการคูณคือการคูณ มันเกิดขึ้นเมื่อมันคูณด้วย -1 negates ชัดเจนกว่านี้ไหม
Steven Sudit

5
@StevenSudit ไม่ไม่ยิ่งกว่า * -1 การคูณด้วย -1 ไม่ใช่ "เคล็ดลับ" มันเป็นวิธีทางคณิตศาสตร์ในการเปลี่ยนจำนวนลบ หมายเลขเป็นเพียงชวเลขของ -1 * จำนวน นอกจากนี้การใช้ Abs เพื่อรักษาจำนวนลบให้มากเกินไป myInt<0 ? myInt : -myInt;ดีกว่ามาก เนื่องจากตัวดำเนินการ - ถูกจัดเตรียมไว้เป็นชวเลขสำหรับ -1 * หมายเลขที่ถูกต้องบวกกับความสามารถในการโอเวอร์โหลดไม่ทำให้ * (-1) เคล็ดลับ
ThunderGr

93

เช่นเดียวกับที่คุณทำสิ่งอื่นใดในแง่ลบ: ใส่เครื่องหมายลบไว้ข้างหน้า

var positive = 6;
var negative = -positive;

8
ทุกคนลืมเครื่องหมายลบไป
เรียกซ้ำ

อะไรคือความแตกต่างระหว่างจริงกับคำตอบนี้: stackoverflow.com/questions/1348080/… int myNegInt = System.Math.Abs(myNumber) * (-1);
goodguys_activate

@ makerofthings7 คำสั่งที่คุณเชื่อมโยงกับคำสั่ง CPU อื่น ๆ อีกมากมาย - การดำเนินการค่าสัมบูรณ์ (อย่างน้อยสามคำแนะนำใน x86) ตามด้วย MUL (หรืออาจเป็น NEG หากคอมไพเลอร์ฉลาด) คำตอบนี้เป็น opcode NEG เดียวที่มีน้ำหนักเบาไม่มีอะไรมากไปกว่าสิ่งที่คุณต้องการ แน่นอนว่าคำตอบทั้งสองนั้นจะทำงานแตกต่างกันเมื่อจำนวนอินพุตเป็นลบอยู่แล้ว หาก (ต่างจากคำถามนี้) ข้อมูลที่คุณป้อนอาจเป็นค่าลบนั่นทำให้คุณตัดสินใจ
Joe White

41

หมายเหตุถึงทุกคนที่ตอบกลับด้วย

- Math.Abs(myInteger)

หรือ

0 - Math.Abs(myInteger)

หรือ

Math.Abs(myInteger) * -1

เป็นวิธีที่จะทำให้จำนวนลบเป็นลบและเปลี่ยนเป็นลบ

วิธีนี้มีข้อบกพร่องเดียว มันไม่ทำงานสำหรับจำนวนเต็มทั้งหมด ช่วงของInt32ประเภทคือตั้งแต่ "-2 31 " ถึง "2 31 - 1" หมายความว่ามีหมายเลข "ลบ" อีกหนึ่งหมายเลข ดังนั้นพ่นMath.Abs(int.MinValue)OverflowException

วิธีที่ถูกต้องคือการใช้ข้อความสั่งแบบมีเงื่อนไข:

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

วิธีนี้ใช้ได้กับจำนวนเต็ม "ทั้งหมด"


ฉันจะโยนคุณจุดเพื่อความถูกต้อง แต่รหัสใด ๆ ที่ขึ้นอยู่กับไม่มีใครรับ Abs ของ MinValue จะเปราะ
Steven Sudit

Steven: บางครั้งคุณกำลังแก้ไขปัญหา (เช่นAbs) ที่ไม่สามารถใช้งานได้int.MinValue(สมมติว่าเป็นintชนิดส่งคืน) ในกรณีนี้คุณตกลงที่จะยกเว้นอย่างสมบูรณ์ อย่างไรก็ตามปัญหาเฉพาะนี้มีผลลัพธ์ "ถูกต้อง" int.MinValueแต่มีข้อยกเว้นหากคุณใช้Absเส้นทาง
Mehrdad Afshari

หลังจากบอกว่าสเกลเชิงลบมีขนาดใหญ่กว่าค่าบวกคุณก็ไปและแนะนำรหัสที่ไม่ได้อธิบาย ถ้าnเป็นเช่น-32768นั้นก็-nคือ-32768!!! นอกจากนี้int neg = n < 0 ? n : -n;อาจไม่สามารถทำงานได้ในทุกกรณีเนื่องจากหนึ่งในไตรภาคไม่ได้ทำสิ่งใดเลย
Clive Galway



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
มีความเสี่ยงเกินไป IMHO เกิดอะไรขึ้นถ้านิยามของวงกลมเปลี่ยนไป?
MusiGenesis

6

แก้ไข: นี่เป็นสิ่งที่ผิดสำหรับอินพุตที่เป็นบวก ... ฉันทำผิดพลาดจากการลืมว่าบิตที่เหลือใน -x (2s-Complement value) เป็น 'ตรงกันข้าม' ของค่าของพวกเขาใน + x ไม่เหมือนกัน ดังนั้นการเปลี่ยนเครื่องหมายบิตจะไม่สามารถใช้กับจำนวนบวกได้

ฉันจะออกจากที่นี่เพื่อวัตถุประสงค์ ...

หรือวิธีที่ยุ่งยาก (ฉันคิดว่า) ...

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 ในบิตเครื่องหมาย (ทำให้เป็นลบ) และปล่อยบิตอื่น ๆ ทั้งหมดให้เหมือนกัน ...

แก้ไข: จริงแล้วตั้งแต่ 1,000 0000 0000 0000 0000 0000 0000 0000 เป็นจริงค่าต่ำสุดสิ่งนี้ควรทำงานเช่นกัน:

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

ดังนั้นลบศูนย์เท่ากับ int.MinValue?
recursive

ไม่ในส่วนเติมเต็มสองครั้งจะไม่มีศูนย์ลบ ทุกคนเป็นลบ 1 Int 8Bit ที่ลงนามแล้ว: 10,000000 คือ -128
Charles Bretana

1
+1 เพราะไม่มีใครสมควรถูกลดระดับเนื่องจากตอบคำถามเช่น "จดหมายอะไรมาหลังจาก A แต่ก่อน C?"
MusiGenesis

... และขอบคุณ @ คำตอบ Mehrad ด้านล่างนี้เป็นวิธีเดียวที่จะทำงานเมื่อป้อนข้อมูลเป็น int.MinValue ...
ชาร์ลส์ Bretana

Charles: นี่มันผิด สำหรับตัวเลขที่ติดลบก็ทำงาน -numberแต่สำหรับตัวเลขบวกเพียงพลิกบิตเครื่องหมายไม่ได้ทำให้ 1เป็นศูนย์ทั้งหมดและหนึ่ง หรือไอเอ็นจีด้วย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));

สนใจอธิบายเพิ่มเติมไหม ด้วยi == int.MinValueดังนั้นตัวแปรทั้งหมดคือ-2147483648
ไคลฟ์กัลเวย์

6

ฉันใช้ myInt = -myInt;

ง่ายและสะดวก

หากคุณต้องการมี แต่แง่บวก

myInt = myInt>0 ? myInt : -myInt;

ฉันกำลังมองหาคำตอบนี้ในสถานการณ์ที่แตกต่างกันเล็กน้อยในฐานะ OP ฉันต้องการที่จะมี 2 ค่าปฏิเสธแต่ละคนถ้าหนึ่งในนั้นคือ -5 ควรเป็น 5 ดังนั้นนี่คือทางออกที่ดีที่สุดของฉัน = D
Mathieu Brouwers

คุณจะได้รับการล้นเนื่องจากint.MaxValueเป็น2147483647แม้จะvar i = int.MaxValue; i++;ไม่ทำงาน
CMS

5

แค่เล่น ๆ:

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

อัปเดต : ความสวยงามของวิธีการนี้คือคุณสามารถปรับโครงสร้างให้เป็นตัวสร้างข้อยกเว้นได้อย่างง่ายดาย:

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

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

ไม่มีใครบอกว่ามันจะต้องมีการใด ๆโดยเฉพาะอย่างยิ่งจำนวนลบ


อืมถ้าคุณไม่สนใจว่ามันจะต้องเป็นจำนวนลบเฉพาะคุณสามารถลดความซับซ้อนนี้เป็น "long negativeNumber = -1;"
Beska

@Guffa: นั่นเป็นเรื่องตลกที่นี่จริง
MusiGenesis





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

มันขึ้นอยู่กับแอปพลิเคชันของคุณ แต่สำหรับฉัน (แกนจอยสติ๊ก Inverting) ฉันต้องการให้แน่ใจว่าทุก ๆ
ด้วยเหตุนี้ฉันแม็พ Max <--> Min และทุกอย่างที่อยู่ระหว่างรับ a * -1
การใช้เทคนิคนี้ -32767 ไม่สามารถเข้าถึงได้เมื่อ inverting

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


Invertion ไป5ไม่ได้แต่-5 1/5
dafie

-2

ใช้ไบนารีและเพื่อลบบิตสุดท้ายที่รับผิดชอบในการลบเครื่องหมาย

หรือใช้เลขฐานสองหรือเพื่อเพิ่มเครื่องหมายให้กับประเภทข้อมูล

Soln นี้อาจฟังดูไร้สาระและไม่สมบูรณ์ แต่ฉันรับประกันได้ว่านี่เป็นวิธีที่เร็วที่สุด

หากคุณไม่ทดลองกับสิ่งที่ฉันโพสต์โพสต์นี้อาจดูอึ: D

เช่นสำหรับ int:

Int คือประเภทข้อมูล 32 บิตดังนั้นบิตสุดท้าย (อันที่ 32) กำหนดเครื่องหมาย

และด้วยค่าที่มี 0 ใน 32 ตำแหน่งและส่วนที่เหลือ 1 มันจะแปลงค่าลบเป็น + ve

สำหรับสิ่งที่ตรงกันข้ามหรือมีค่า 1 ใน 32 และพัก 0


-3

X=*-1อาจไม่สามารถทำงานได้กับคอมไพเลอร์ทั้งหมด ... เนื่องจากมันอ่าน 'ทวีคูณ' 'SUBTRACT' 1 แทนการเป็นลบลบ alt ที่ดีกว่าคือX=(0-X)[ซึ่งแตกต่างจากX-=X]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.