C #에서 양수를 음수로 변환


142

다음과 같이 음수를 양수로 변환 할 수 있습니다.

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

양수를 음수로 만드는 동등한 방법이 있습니까?



3
280Z28 : 이는 myInt = -1과 같습니다.
재귀

1
myInt | = int.MinValue 여야합니다.
Charles Bretana

280Z28 @ : 그것은 단지 그렇지 않으면 숫자 음을 한 다음 1 뺀와 동일합니다, 홀수 작동
세실이 이름 가지고

3
코드의 명확성을 위해 "음수를 양수로 변환"하려는 경우 System.Math.Abs ​​()를 사용해야한다고 생각하지 않습니다. 수학적으로는 원하는 결과를 얻더라도 절대 값이 아닙니다. 알고리즘 컨텍스트에 따라 음수에서 양수로 전환하기 위해 아래에서 승인 한 솔루션을 사용해야합니다.
Chris Dwyer

답변:


452

어때요?

myInt = myInt * -1


55
이 솔루션은 음수를 양수로 변환 할 수 있기 때문에 훌륭합니다! 천재!
Will Eddins

19
나는 당신이 단순히 그것을 부정하기 위해 무엇이든 앞에 "-"를 붙일 수 있다는 인상을 받았습니다 ... -myInt 이것은 myInt의 값의 음수가 될 것입니다 ... -ABS (myInt)는 가혹한 음수가 될 것입니다.
DataDink

12
무엇에 대해 myInt = - Myint?
kokbira

9
또는 더 짧은 myInt *= - 1?
nawfal

참고로 kokbira의 방법을 short로 시도 myShort = (short) -myShort하면 부정이 발생할 때 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.Abs ​​하나보다 낫습니다. 어떤 일이 일어나고 있는지 조금 더 분명하기 때문에 ... 문 앞에 "-"를 놓치는 것이 약간 더 쉽다고 생각합니다.
Beska

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

11
네, 부정이 목표이기 때문에 단항 마이너스가 올바른 연산자입니다. 반면에 음수를 곱하면 값을 부정하는 트릭입니다.
Steven Sudit

38
주요 효과가 아닌 부작용에 의존하기 때문에 속임수입니다. 단항 마이너스의 주요 효과는 부정입니다. 곱셈의 주요 효과는 곱하는 것입니다. -1을 곱하면 무효화됩니다. 더 명확합니까?
Steven Sudit

5
@StevenSudit 아니요, * -1보다 좋지 않습니다. -1을 곱하는 것은 "속임수"가 아니라 숫자를 음수로 바꾸는 수학적 방법입니다. -Number는 -1 * Number의 약어입니다. 또한, 음수를 유지하기 위해 Abs를 사용하는 것은 과도한 일입니다. myInt<0 ? myInt : -myInt;훨씬 낫다. -연산자가 적절한 -1 * Number와 오버로딩 기능의 약어로 제공되기 때문에 * (-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) 이옵니다. 이 답변은 하나의 가벼운 NEG opcode이며 필요한 것 이상입니다. 물론, 입력 숫자가 이미 음수이면 두 답변이 다르게 동작합니다. (이 질문과 달리) 귀하의 의견이 부정적 일 경우, 귀하를 대신하여 결정합니다.
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;

이 접근 방식은 "모든"정수에 적용됩니다.


나는 당신에게 정확성에 대한 요점을 던져 줄 것이지만, MinValue의 Abs를 복용하는 사람에 의존하지 않는 코드는 취하기 쉽습니다.
Steven Sudit

스티븐 : 때때로, 당신은 ( 돌아갈 수있는 타입을 가정 Abs할 수없는) 문제를 해결하고 있습니다 .이 경우 예외를 던지는 것이 좋습니다. 그러나이 특정 문제는 "유효한"결과가 있지만 경로 를 사용하면 예외가 발생 합니다. int.MinValueintint.MinValueAbs
Mehrdad Afshari

음수 스케일이 양수보다 크다고 말한 후에는이를 설명하지 않는 코드를 제안하십시오. 경우 n입니다 -32768다음 -n-32768! 또한 int neg = n < 0 ? n : -n;삼항 중 하나가 전혀 아무것도하지 않기 때문에 모든 경우에 작동 할 수는 없습니다.
Clive Galway

20

쉬운 방법 :

myInt *= -1;

1
동일하게 게시하려고했는데 모두가 * = some love :-)를 보여 주어야 함
Brian Scott

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
너무 위험 해, 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을 넣고 (음수) 다른 모든 비트를 동일하게 유지합니다 ...

편집 : 실제로 1000 0000 0000 0000 0000 0000 0000 0000은 실제로 최소값이므로 다음과 같이 작동합니다.

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

따라서 음의 0은 int.MinValue와 같습니다.
재귀

아니요, 2의 보수에서는 음의 0이 없습니다. 10000000가 -128입니다 : 모든 사람은 1. 서명 8 비트 Int 인 음
찰스 Bretana

1
+1 "A 다음에 C 이후에 어떤 문자가 나오는가?"와 같은 질문에 답할 사람이 아무도 없어서 +1
MusiGenesis

... 그리고, 덕분에 아래 Mehrad의 대답 @, 이것은 유일한 방법은 해당 작품 입력 int.MinValue ... 때
찰스 Bretana

찰스 : 이것은 잘못입니다. 음수의 경우 작동하지만 양수의 경우 부호 비트를 뒤집어도 만들 수 없습니다 -number. 1모두 0과 1입니다. 그것을 또는 - 보내고 int.MinValue같지 않은 10000000000000000000000000000001됩니다 -1(모든 사람을.)
메흐 다드 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
클라이브 골웨이

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와 약간 다른 상황 에서이 답변을 찾고있었습니다. 나는 그들 중 하나 인 경우 -5 다른 5해야이 내 최선의 해결책 = D이다 그 때문에이 개 값은, 서로를 부정하고 싶지
마티유 BROUWERS

int.MaxValueis 이후로 오버플로 가 발생 2147483647하고 var i = int.MaxValue; i++;작동하지 않습니다.
CMS

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

아무도 그것이 특정한 음수 여야한다고 말하지 않았습니다 .


음, 특정 음수 여야한다고 신경 쓰지 않으면 이것을 "long negativeNumber = -1;"으로 단순화 할 수 있습니다.
Beska

@ 구파 : 그것은 실제로 농담입니다.
MusiGenesis




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; }


에 Invertion은 5아니다 -5,하지만 1/5.
dafie

-2

이진수를 사용하고 음수 부호를 담당하는 마지막 비트를 제거하십시오.

또는 바이너리를 사용하거나 데이터 유형에 부호를 추가하십시오.

이 솔른은 터무니없고 불완전하게 들릴지 모르지만 이것이 가장 빠른 방법임을 보장 할 수 있습니다.

내가 게시 한 내용을 실험하지 않으면이 게시물이 쓸모없는 것처럼 보일 수 있습니다 : D

예를 들어 int :

Int는 32 비트 데이터 유형이므로 마지막 비트 (32 번째)는 부호를 결정합니다.

그리고 32 자리에서 0을 유지하고 1을 쉬십시오. 음수를 + ve로 변환합니다.

32 번째 자리에서 1의 값을 가진 반대 또는 0의 경우 휴식하십시오.


-3

X=*-1모든 컴파일러에서 작동하지 않을 수 있습니다 ... NEGATIVE 대신 'multiply' 'SUBTRACT'1을 읽으므로 더 나은 대안은 X=(0-X)[WHICH IS DIFF FROM X-=X]입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.