23 ответов:
точно так же, как вы делаете что-нибудь еще отрицательное: поместите отрицательный знак перед ним.
var positive = 6; var negative = -positive;
Примечание для всех, кто ответил с
- 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;этот подход работает для "всех" чисел.
int negInt = 0 - myInt;или гарантированно будет отрицательным.
int negInt = -System.Math.Abs(someInt);
чтобы переключить знак целого числа, вы просто используете оператор знака:
myInt = -myInt;чтобы сделать его отрицательным независимо от того, является ли исходное значение отрицательным или нет, вы сначала используете метод Abs:
myInt = -Math.Abs(myInt);
EDIT: это неправильно для положительных входов... Я сделал ошибку, забыв, что остальные биты в-x (2S-Complement value) являются "противоположными" их значению в +x, а не одинаковыми. Поэтому простое изменение знакового бита не будет работать для положительных чисел.
Я оставлю это здесь Для в целях...
или хитрый способ ( я думаю )...
int y = x / ~int.Максвеллову;
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 на самом деле является Minvalue, это также должно работать:
int y = x | int.MinValue; // or, to do it to itself, x |= int.MinValue;
просто для удовольствия:
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);
просто для удовольствия:
int negativeInt = int.Parse(String.Format("{0}{1}", "-", positiveInt.ToString()));обновление: красота этого подхода заключается в том, что вы можете легко переделать его в генератор исключение:
int negativeInt = int.Parse(String.Format("{0}{1}", "thisisthedumbestquestioninstackoverflowhistory", positiveInt.ToString()));
несмотря на то, что я опаздываю на вечеринку здесь, я собираюсь перезвонить с некоторыми полезными трюками из моих аппаратных дней. Все они предполагают представление комплимента 2 для подписанных чисел.
int negate = ~i+1; int positiveMagnitude = (i ^ (i>>31)) - (i>>31); int negativeMagnitude = (i>>31) - (i ^ (i>>31));
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);никто не сказал, что это должен быть любой особенности отрицательное число.
Я использую
myInt = -myInt;Так Просто и легко
Если вы хотите иметь только положительные
myInt = myInt>0 ? myInt : -myInt;
преобразование числа из положительного в отрицательное или из отрицательного в положительное:
public static decimal Reverse(this decimal source) { return source * decimal.MinusOne; }
просто то, что я хочу поделиться.
public decimal NumberReevaluate(decimal number, bool isPositive) { var tempNumber = System.Math.Abs(number); return isPositive ? tempNumber : -tempNumber; }
как уже упоминалось ранее, просто умножение на -1 не круто, как
int.MinValue * -1 == int.MinValueэто действительно зависит от вашего приложения, но для моего (Инвертирование осей джойстика) я хочу убедиться, что все крайности по-прежнему доступны и поддерживают как можно большую точность.
С этой целью я сопоставляю Max Min и все между ними получает a* -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; }
X=*-1может работать не на всех компиляторах... поскольку он читает "умножить ""вычесть" 1 вместо отрицательного Чем лучше altX=(0-X), [ЧТО ОТЛИЧАЕТСЯ ОТX-=X]
используйте двоичный и удалить последний бит, который отвечает за отрицательный знак.
или использовать двоичный код или добавить знак к типу данных.
Это soln может показаться абсурдным и неполным, но я могу гарантировать, что это самый быстрый метод.
Если вы не экспериментируете с тем, что я опубликовал, этот пост может выглядеть дерьмово :D
например, для int:
Int-это 32-битный тип данных, поэтому последний бит (32-й) определяет знак.
и со значением который имеет 0 в 32 месте и остальные 1. Он будет преобразовывать отрицательные не положительные.
для прямо противоположного или со значением с 1 на 32-м месте и отдыха 0.
Comments