【问题标题】:Convert a positive number to negative in C#在 C# 中将正数转换为负数
【发布时间】:2009-08-28 16:23:52
【问题描述】:

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

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

有没有等价的方法让正数变成负数?

【问题讨论】:

  • 280Z28: 相当于 myInt = -1。
  • 必须是 myInt |= int.MinValue;
  • @280Z28: 这只对奇数有效,否则和把数字变成负数,然后减1一样。
  • 为了代码清晰,如果您只想“将负数转换为正数”,我认为您不应该使用 System.Math.Abs​​()。从数学上讲,这不是绝对值,即使你得到了想要的结果。根据您的算法上下文,您也应该使用您在下面接受的解决方案来从否定变为肯定。

标签: c#


【解决方案1】:

怎么样

myInt = myInt * -1

【讨论】:

  • 这个解决方案很棒,因为它还可以将负数转换为正数!天才!
  • 我的印象是你可以简单地在任何东西前面加上一个“-”来否定它...... -myInt 这将是 myInt 中值的负数...... -ABS( myInt) 将是一个garaunteed否定。
  • myInt = - Myint 呢?
  • 或者更短的myInt *= - 1?
  • 如果你使用这个答案,溢出的可能性如何?
【解决方案2】:
int myNegInt = System.Math.Abs(myNumber) * (-1);

【讨论】:

  • +1 记住如果它已经是负面的,你会产生相反的效果。无论 myNumber 是正数还是负数,您的答案都是唯一一个总是给出负数的答案。
  • 这个答案只有 26 票?是否有 SO 用户认为这行不通?
  • 30 票赞成?这个问题已经很简单了。而这个过于复杂的答案(-System.Math.Abs​​(myNumber) 也可以)得到 30 票赞成???
  • @rstevens 每个人都在合作试图表明这个答案比公认的答案正确得多。此外, - vs * -1 绝对不是“过于复杂”。
  • 我比 -System.Math.Abs​​ 更喜欢这个答案,因为它一目了然发生了什么......我认为错过“ -”在声明前面。
【解决方案3】:
int negInt = -System.Math.Abs(myInt)

【讨论】:

  • 是的,因为否定是目标,所以一元减号是正确的运算符。另一方面,乘以负数只是一个取反的技巧。
  • 这是一个技巧,因为它依赖于副作用,而不是主要效果。一元减法的主要作用是取反。乘法的主要作用是乘法。碰巧乘以-1会否定。是不是更清楚了?
  • @StevenSudit 不,不比 * -1 好。乘以 -1 不是“技巧”,而是将数字变为负数的数学方法。 -Number 只是 -1*Number 的简写。此外,使用 Abs 来保持数字为负值是一种矫枉过正的做法。 myInt<0 ? myInt : -myInt; 好多了。仅仅因为提供了 - 运算符作为正确的 -1*Number 加上重载功能的简写,并不能使 * (-1) 成为一种技巧。
【解决方案4】:

就像你把其他东西变成负数一样:在它前面加上一个负号。

var positive = 6;
var negative = -positive;

【讨论】:

  • 每个人都会忘记一元减号。
  • 这个答案和这个答案有什么实际区别:stackoverflow.com/questions/1348080/…int myNegInt = System.Math.Abs(myNumber) * (-1);
  • @makerofthings7,你链接的那个是更多的 CPU 指令——一个绝对值操作(至少在 x86 上是 three instructions),然后是一个 MUL(或者可能是一个 NEG,如果编译器很聪明)。这个答案是一个单一的、轻量级的 NEG 操作码,只不过是你需要的。当然,当输入数字已经为负时,这两个答案的行为会有所不同;如果(与这个问题不同)您的意见可能是否定的,那将由您做出决定。
  • 我脑海中浮现的问题是性能水平上什么更好?变量前面的减号还是乘以-1?
【解决方案5】:

给所有回复的人注意

- Math.Abs(myInteger)

0 - Math.Abs(myInteger)

Math.Abs(myInteger) * -1

作为一种保持负数为负数并将正数变为负数的方法。

这种方法有一个缺陷。它不适用于所有整数。 Int32 类型的范围是从“-231”到“231 - 1”。这意味着还有一个“负”数。因此,Math.Abs(int.MinValue) 会抛出 OverflowException

正确的方法是使用条件语句:

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

这种方法适用于“所有”整数。

【讨论】:

  • 我会向你提出正确的观点,但是任何依赖于没有人采用 MinValue 的 Abs 的代码都是脆弱的。
  • Steven: 有时,你正在解决的问题(如Abs)对于int.MinValue(假设int 返回类型)不可能工作。在这种情况下,完全可以抛出异常。但是,此特定问题对于 int.MinValue 有一个“有效”结果,但如果您采用 Abs 路由,则会引发异常。
  • 在说负比例大于正比例之后,您然后去建议不考虑这一点的代码。如果n-32768 那么-n 也是-32768 !!!此外,int neg = n &lt; 0 ? n : -n; 不可能在所有情况下都有效,因为其中一个三元组绝对什么都不做。
【解决方案6】:

简单的方法:

myInt *= -1;

【讨论】:

  • 正要发一样的,大家应该表现出 *= 一些爱 :-)
【解决方案7】:
int negInt = 0 - myInt;

或保证为负数。

int negInt = -System.Math.Abs(someInt);

【讨论】:

    【解决方案8】:

    要切换整数的符号,只需使用符号运算符:

    myInt = -myInt;
    

    无论原始值是否为负,要使其为负,首先使用 Abs 方法:

    myInt = -Math.Abs(myInt);
    

    【讨论】:

      【解决方案9】:

      我用myInt = -myInt;

      如此简单易行

      如果你只想有积极的

      myInt = myInt>0 ? myInt : -myInt;
      

      【讨论】:

      • 我在与 OP 略有不同的情况下寻找这个答案。如果其中一个是-5,另一个应该是5,我想让2个值相互否定,因此这是我最好的解决方案=D
      • 你会得到一个溢出,因为int.MaxValue2147483647,即使var i = int.MaxValue; i++; 也不会工作
      【解决方案10】:

      只是为了更有趣:

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

      【讨论】:

      • 太冒险了,恕我直言。如果圆的定义发生变化怎么办?
      【解决方案11】:

      编辑:这对于正输入是错误的......我忘记了 -x 中的其余位(2s-补码值)是它们在 +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;
      

      【讨论】:

      • 所以,负零等于 int.MinValue?
      • 不,在二进制补码中,没有负零。都是负数 1. A Signed 8Bit Int: 10000000 is -128
      • +1 因为没有人应该因为回答诸如“什么字母在 A 之后但在 C 之前?”之类的问题而被否决
      • ... 并且感谢@Mehrad 在下面的回答,这是当输入为 int.MinValue...时唯一有效的方法...
      • 查尔斯:这是错误的。对于负数,它有效,但对于正数,仅翻转符号位不会产生-number1 是全零和一。与int.MinValue 进行或运算将导致 10000000000000000000000000000001 不等于 -1(全为)。
      【解决方案12】:

      尽管我在这里参加聚会已经很晚了,但我还是会从我的硬件时代讲一些有用的技巧。所有这些都假设有符号数的 2 的补码表示。

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

      【讨论】:

      • 想多解释一下吗?用i == int.MinValue,那么所有变量都是-2147483648
      【解决方案13】:

      只是为了好玩:

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

      更新:这种方法的美妙之处在于您可以轻松地将其重构为异常生成器:

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

      【讨论】:

        【解决方案14】:
        long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);
        

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

        【讨论】:

        • 嗯,如果你不在乎它必须是一个特定的负数,你可以将它简化为“longnegativeNumber = -1;”
        • @Guffa:这就是笑话,实际上。
        【解决方案15】:

        也许是这个?

        int n;
        
        .... some coding....
        
        n = n<=0? n:0-n;
        

        【讨论】:

          【解决方案16】:
          int myInt = - System.Math.Abs(-5);
          

          【讨论】:

            【解决方案17】:

            乘以-1。

            【讨论】:

              【解决方案18】:

              如前所述,仅乘以 -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
              【解决方案19】:

              将数字从正数转换为负数,或将负数转换为正数:

              public static decimal Reverse(this decimal source)
              {
                   return source * decimal.MinusOne;
              }
              

              【讨论】:

                【解决方案20】:

                只是我想分享的东西。

                public decimal NumberReevaluate(decimal number, bool isPositive)
                {
                    var tempNumber = System.Math.Abs(number);
                    return isPositive ? tempNumber : -tempNumber;
                }
                

                【讨论】:

                • number &gt;= 0 == isPositive ? number : -number
                【解决方案21】:

                使用二进制并删除负责负号的最后一位。

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

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

                如果你不尝试我发布的内容,这篇文章可能看起来很糟糕:D

                例如 int:

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

                并且在第 32 位的值为 0,其余为 1。它将否定的 no 转换为 +ve。

                正好相反,或者在第 32 位的值为 1,其余为 0。

                【讨论】:

                  【解决方案22】:

                  X=*-1 可能不适用于所有编译器...因为它读取的是 'multiply' 'SUBTRACT' 1 而不是 NEGATIVE 更好的 alt 是 X=(0-X),[与 X-=X 不同]

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-12-13
                    • 2015-06-14
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-02-03
                    相关资源
                    最近更新 更多