在C#中将正数转换为负数


142

您可以像这样将负数转换为正数:

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

是否有使正数为负的等效方法?



3
280Z28:相当于myInt = -1。
递归

1
必须是myInt | = int.MinValue;
2009年

@ 280Z28:这仅适用于奇数,否则它一样使负号,再减去1
塞西尔有一个名字

3
为了代码清晰起见,如果您只是想“将负数转换为正数”,我认为您不应该使用System.Math.Abs​​()。从数学上讲,即使您获得了期望的结果,绝对值也不是绝对值。根据您的算法环境,您也应该使用下面已经接受的解决方案,从负到正也要使用。
克里斯·德威

Answers:


452

怎么样

myInt = myInt * -1


55
这个解决方案很棒,因为它也可以将负数转换为正数!天才!

19
我给您的印象是,您只需在任何内容前加上一个“-”即可将其取反... -myInt这将是myInt中值的负数... -ABS(myInt)将是一个被保证的负数。
DataDink

12
那又如何myInt = - Myint呢?
kokbira 2012年

9
或更短myInt *= - 1
nawfal

仅供参考,如果您尝试使用short的kokbira方法,则强制转换myShort = (short) -myShort是必要的,因为short取反时会变成int。
AaronLS

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

29
+1是为了记住,如果它已经是负数,那么您将获得相反的效果。您的答案是唯一一个始终给出负数的答案,而不管myNumber是正数还是负数。
大卫,2009年

这个答案只有26票?有没有SO用户认为这行不通?
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 2014年

93

您将其他任何东西设为负面的方法也一样:在其前面放置一个负号。

var positive = 6;
var negative = -positive;

8
每个人都忘记一元减号。
递归

什么这之间和这个答案的实际区别: stackoverflow.com/questions/1348080/... int myNegInt = System.Math.Abs(myNumber) * (-1);
goodguys_activate

@ makerofthings7,与之链接的是更多的CPU指令-绝对值运算(x86 上至少有3条指令),然后是MUL(如果编译器很聪明,则可能是NEG)。答案是一个轻量级的NEG操作码,仅比您所需的少。当然,当输入数字已经为负数时,这两个答案的行为会有所不同。如果(与该问题不同)您的输入可能为负,则为您做出决定。
乔·怀特

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

史蒂文(Steven):有时,您正在解决的问题(例如Abs)无法解决int.MinValue(假定int返回类型。)在这种情况下,抛出异常是完全可以的。但是,此特定问题的结果为“有效”,int.MinValue但如果您选择Abs路线,则会引发异常。
Mehrdad Afshari

在说负数比例大于正数之后,您可以建议不考虑这一点的代码。如果n是的-32768-n也是-32768!此外int neg = n < 0 ? n : -n;,由于三元组之一绝对不执行任何操作,因此不可能在所有情况下都有效。
克莱夫·戈尔韦

20

简单的方法:

myInt *= -1;

1
即将发布相同消息,每个人都应该表现出* =一些爱心:-)
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
风险太大,恕我直言。如果圆的定义发生变化怎么办?
MusiGenesis

6

编辑:这对于正输入是错误的...我犯了一个错误,忘记了-x(2s-Complement值)中的其余位与它们在+ x中的值“相反”,而不是相同。因此,仅更改符号位将不适用于正数。

我将其留在这里出于目的...

还是棘手的方式(我认为)...

整数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 0000实际上是最小值,所以这也应该起作用:

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

那么,负零等于int.MinValue吗?
递归

不,在二进制补码中,不存在负零。所有的都是负数1。一个有符号的8位整数:10000000是-128
Charles Bretana 09年

1
+1是因为没有人会因为回答“在A之后但在C之前是什么字母?”这样的问题而受到谴责。
MusiGenesis

......并且由于@下面Mehrad的答案,这是唯一的办法,工作时输入int.MinValue ...
查尔斯BRETANA

查尔斯:这是错误的。对于负数,它起作用,但对于正数,仅翻转符号位不会起作用-number1都是零和一。用的OR-ing它int.MinValue会导致10000000000000000000000000000001这不等于-1(全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
Clive Galway '18

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稍有不同的情况下寻找此答案。我想让2个值互斥,如果其中一个为-5,另一个应为5,因此这是我的最佳解决方案= D
Mathieu Brouwers

因为int.MaxValue2147483647,您将溢出,甚至var i = int.MaxValue; i++;无法工作
CMS

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

没人说这必须是任何特定的负数。


嗯,如果您不在乎它一定是一个特定的负数,则可以将其简化为“ long negativeNumber = -1;”。
Beska

@Guffa:这真是个笑话。
MusiGenesis 2011年

4

也许这个吗?

int n;

.... some coding....

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



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
维塔利

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


5不是-5,而是1/5
dafie

-2

使用binary和删除负责负号的最后一位。

或使用二进制或将符号添加到数据类型。

这种解决方案听起来很荒谬和不完整,但是我可以保证这是最快的方法。

如果您不尝试我发布的内容,则此帖子可能看起来很糟糕:D

例如int:

Int是32位数据类型,因此最后一位(第32位)确定符号。

且其值在32位和0处均为0,并将负数no转换为+ ve。

对于恰好相反或在第32位具有1的值,其余为0。


-3

X=*-1可能不适用于所有编译器...因为它读取的是“乘”的“ SUBTRACT” 1,而不是负数。更好的选择是X=(0-X),[WHICH IS DIFF FROM X-=X]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.