2009-08-28 67 views
115

Bạn có thể chuyển đổi một số tiêu cực đến tích cực như thế này:Chuyển đổi một số dương sang âm trong C#

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

Có một phương pháp tương đương để thực hiện một số dương tiêu cực?

+0

'myInt | = -1; 'lol –

+0

http://en.wikipedia.org/wiki/Additive_inverse –

+3

280Z28: Đó là tương đương tới myInt = -1. – recursive

Trả lời

356

Làm thế nào về

myInt = myInt * -1 

+0

Giải pháp tốt. :) –

+3

Cảm ơn, nên biết, đó là buổi chiều thứ sáu cho bạn ... zzzz –

+37

Giải pháp này rất tuyệt vì nó cũng có thể chuyển đổi âm sang dương! Thiên tài! –

17
int negInt = 0 - myInt; 

Hoặc đảm bảo là số âm.

int negInt = -System.Math.Abs(someInt); 
199
int myNegInt = System.Math.Abs(myNumber) * (-1); 
+23

+1 để ghi nhớ rằng nếu nó đã là một tiêu cực, bạn sẽ có tác dụng ngược lại. Câu trả lời của bạn là câu trả lời duy nhất sẽ luôn cung cấp số âm cho dù myNumber là dương hay âm. – David

+0

Chỉ có 26 phiếu cho câu trả lời này? Có SO người dùng nghĩ rằng điều này sẽ không hoạt động? – MusiGenesis

+4

30 phiếu bầu? Câu hỏi rất đơn giản. Và câu trả lời quá phức tạp này (-System.Math.Abs ​​(myNumber) cũng sẽ làm) nhận được 30 phiếu bầu ???? – mmmmmmmm

19

Cách dễ dàng:

myInt *= -1; 
+0

Đã sắp đăng, mọi người sẽ hiển thị * = một số tình yêu :-) –

3

Multiply nó bằng -1.

119
int negInt = -System.Math.Abs(myInt) 
+4

Nicer hơn "* -1". –

+11

Có, bởi vì phủ định là mục tiêu, do đó, một trừ đi đơn nhất là toán tử đúng. Mặt khác, nhân với một tiêu cực chỉ là một thủ thuật để phủ nhận một giá trị. –

+2

Một thủ thuật? Bạn đang lừa ai vậy? – Shog9

84

Tương tự như cách bạn tạo ra bất kỳ điều gì khác tiêu cực: đặt dấu trừ ở phía trước.

var positive = 6; 
var negative = -positive; 
+7

Mọi người đều quên số nguyên đơn trừ. – recursive

+1

+1 .. đánh bại tôi. – Inisheer

+9

Đây phải là câu trả lời được chấp nhận. –

7

EDIT: Đây là sai vì những đóng góp tích cực ... Tôi đã sai lầm khi quên rằng phần còn lại của các bit trong -x (2s-Bổ sung giá trị) là 'trái ngược' của giá trị của họ trong + x, không giống nhau. SO đơn giản thay đổi bit dấu sẽ KHÔNG làm việc cho các số dương.

Tôi sẽ rời khỏi đây vào đây để in cho các mục đích ...

Hoặc cách khéo léo (tôi nghĩ) ...

int y = x | ~ int.MaxValue;

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

nên

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

và do đó bất kỳ int32 Or'ed với điều đó sẽ đặt một 1 trong các bit dấu, (làm cho nó tiêu cực), và để lại tất cả các bit khác nhau ...

EDIT: trên thực tế, Từ 1000 0000 0000 0000 0000 0000 0000 0000 thực sự là MINVALUE, điều này cũng nên làm việc:

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

Vì vậy, số không âm bằng int.MinValue? – recursive

+0

Không, trong sự bổ sung twos, không có số không âm. tất cả đều là số âm 1. Ký hiệu 8Bit Int: 10000000 là -128 –

+1

+1 vì không ai bị giảm giá để trả lời câu hỏi như "chữ cái nào sau A nhưng trước C?" – MusiGenesis

11

Để chuyển các dấu hiệu của một số nguyên, bạn chỉ cần sử dụng toán tử dấu :

myInt = -myInt; 

Để làm cho nó tiêu cực bất kể nếu giá trị ban đầu là tiêu cực hay không, trước tiên bạn sử dụng phương pháp Abs:

myInt = -Math.Abs(myInt); 
6

Just for fun:

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

Cập nhật: vẻ đẹp của phương pháp này là bạn có thể dễ dàng cấu trúc lại nó thành một máy phát điện ngoại lệ:

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

Quyền của bạn: Dễ hỏi hơn là nghĩ, đó là lý do tại sao các câu hỏi như thế này xuất hiện. Nhưng vấn đề thực sự là có những người nhận được rất nhiều danh tiếng trả lời các câu hỏi như thế này. Ở phía bên kia có những người phá vỡ bộ não của họ để giải quyết vấn đề thực sự và chỉ nhận được 1 phiếu bầu vì không ai có thể đảm nhận những gì họ đang giải quyết. Thú vị không? – backslash17

+2

@ backslash17: Tôi hoàn toàn đồng ý. Có rất nhiều ví dụ về hiện tượng này trên StackOverflow, nhưng câu hỏi này chắc chắn là vô lý nhất. Ý tôi là, "làm thế nào để bạn tạo ra một số dương âm?", Và mọi người đang thực sự tranh luận về điều này? Bạn nghiêm túc chứ? – MusiGenesis

+0

@ backslash17 - Có! –

4

Có lẽ điều này?

int n; 

.... some coding.... 

n = n<=0? n:0-n; 
+0

giải pháp tốt nhất – kokbira

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

Không ai nói nó phải là bất kỳ đặc biệt số âm.

+0

Um, nếu bạn không quan tâm rằng nó phải là số âm * cụ thể *, bạn có thể đơn giản hóa điều này thành "dài negativeNumber = -1;" – Beska

+0

Eh, chỉ cần làm cho nó một byte. :) – MusiGenesis

+0

Một byte không thể là số âm ... – Guffa

6

Just for fun hơn:

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

Quá nguy hiểm, IMHO. Điều gì sẽ xảy ra nếu định nghĩa của một vòng kết nối thay đổi? – MusiGenesis

+1

OK, như thế nào 'bout Math.Sin (-Math.Pi/2) * ... –

37

Lưu ý đến tất cả những ai đáp lại bằng

- Math.Abs(myInteger) 

hoặc

0 - Math.Abs(myInteger) 

hoặc

Math.Abs(myInteger) * -1 

là cách giữ số âm âm và biến số âm dương.

Cách tiếp cận này có một lỗ hổng duy nhất. Nó không hoạt động cho tất cả các số nguyên. Phạm vi của loại Int32 là từ "-2 " tới "2 - 1." Nó có nghĩa là có thêm một số "tiêu cực". Do đó, Math.Abs(int.MinValue) ném một số OverflowException.

Cách đúng là sử dụng câu điều kiện:

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

Cách tiếp cận này làm việc cho "tất cả" số nguyên.

+0

Tôi sẽ gửi cho bạn điểm chính xác, nhưng bất kỳ mã nào phụ thuộc vào không ai lấy Abs of MinValue là dễ vỡ. –

+0

Steven: Đôi khi, bạn đang giải quyết một vấn đề (như 'Abs') mà không thể làm việc cho' int.MinValue' (giả sử 'int' return type.) Trong trường hợp đó, nó hoàn toàn OK để ném một ngoại lệ. Tuy nhiên, vấn đề cụ thể này có một kết quả "hợp lệ" cho 'int.MinValue' nhưng ném một ngoại lệ nếu bạn sử dụng tuyến' Abs'. –

+0

nhưng x | = int.MinValue hoạt động cho tất cả các số nguyên, bao gồm MinValue ... –

4

Mặc dù tôi đến trễ bữa tiệc ở đây, tôi sẽ trò chuyện với một số thủ thuật hữu ích từ những ngày phần cứng của tôi. Tất cả những giả định của 2 đại diện khen cho các số đã ký.

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

X=*-1 có thể không hoạt động trên tất cả các trình biên dịch ...kể từ khi nó đọc một 'nhân' 'SUBTRACT' 1 thay vì NEGATIVE alt tốt hơn là X=(0-X), [ĐÓ LÀ TỪ X-=X]

+1

... bạn có nghĩa là X * = - 1 không? – kokbira

-2

Sử dụng nhị phân và để loại bỏ bit cuối cùng chịu trách nhiệm cho dấu âm.

Hoặc sử dụng nhị phân hoặc để thêm dấu vào kiểu dữ liệu.

Giải pháp này có vẻ vô lý và không đầy đủ nhưng tôi có thể đảm bảo đây là phương pháp nhanh nhất.

Nếu bạn không thử nghiệm với những gì tôi đã đăng tải bài viết này có thể trông tào lao: D

Ví dụ cho int:

Int là 32 bit datatype để các bit cuối cùng (32th một) xác định các dấu hiệu .

Và với giá trị 0 ở vị trí 32 và nghỉ ngơi 1. Nó sẽ chuyển đổi âm thành không thành +.

Đối với điều ngược lại hoặc với một giá trị với 1 ở vị trí 32th và nghỉ ngơi 0.

0

Cách dễ dàng hơn a = -a sẽ làm lợi

3

tôi sử dụng myInt = -myInt;

Vì vậy, đơn giản và dễ dàng

Nếu bạn chỉ muốn tích cực

myInt = myInt>0 ? myInt : -myInt; 
+0

Tôi đang tìm câu trả lời này trong một tình huống hơi khác với OP. Tôi muốn có 2 giá trị phủ nhận eachother nếu một trong số họ là -5 khác nên là 5, vì đây là giải pháp tốt nhất của tôi = D –

0

Chuyển đổi một số từ dương sang âm, hoặc âm sang dương:

public static decimal Reverse(this decimal source) 
{ 
    return source * decimal.MinusOne; 
} 
Các vấn đề liên quan