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.