Разве в c нет оператора для изменения знака типа int float и т. д. с отрицательного на положительный или наоборот? - PullRequest
9 голосов
/ 08 января 2010

пытался найти абсолютное значение, и я подумал, что есть простой способ просто перевернуть знак с помощью '~' или чего-то еще.

Ответы [ 8 ]

21 голосов
/ 08 января 2010
float newValue = oldValue * -1;

или

float newValue = -(oldValue); //() aren't needed, I just use them out of habit
12 голосов
/ 08 января 2010

Простое отрицание с - работает, но большинство ответов игнорируют тот факт, что ОП пытается сделать абсолютное значение. Для этого правильный инструмент - abs() для целых чисел и fabs() для чисел с плавающей запятой. Код будет кристально чистым, и результат будет таким, как вы ожидаете. (Изменить: Обязательно прочтите документацию и ошибки для этих инструментов. Как отмечает Ник, отрицание самого отрицательного числа с помощью abs() возвращает такое же отрицательное число.)

12 голосов
/ 08 января 2010

Чтобы инвертировать знак, поставьте перед ним минус.

8 голосов
/ 08 января 2010

Оператор унарного отрицания -(expr) делает именно то, что вы хотите.

int x = -7;
int y = 7;
x = -x; // x is now 7
y = -y; // y is now -7

Оператор побитового дополнения ~(expr), который вы упоминаете, с другой стороны, переворачивает все биты на входе.

В случае, если это помогает, одна проблема, которая возникает во многих реализациях абсолютных значений в диком игнорировании, заключается в том, что отрицание наиболее отрицательного значения данного целочисленного типа дополнения с фиксированным размером два переполнится.

4 голосов
/ 08 января 2010

-x даст вам инвертированное значение x.

3 голосов
/ 05 октября 2010

Хитрый предмет. Прямой способ изменить знак числа с плавающей запятой состоит в том, чтобы перевернуть значение старшего значащего бита переменной. Обозначения, перечисленные в других ответах, зависят от компилятора, что обычно хорошо, но не всегда. Для «float x» ответ:

*(unsigned int*)&x ^= (1<<31)

Если вы пишете для чего-то вроде iPhone, который имеет процессор Cortex A8 (или что-то подобное), вы хотите избежать двойных значений, а также избежать условных выражений при работе с плавающими во внутренних циклах. Итак, вы можете сделать это:

*(unsigned int*)&x ^= ( (x<0) << 31 );

Что превратит негативы в позитивы без использования инструкции ветвления. Если это происходит во внутреннем цикле, это будет в 5-20 раз быстрее, чем при использовании другого метода на iPhone. Если это не во внутреннем цикле, то вам, вероятно, это безразлично!

1 голос
/ 08 января 2010

х = 0 - х;

? или я упускаю суть?

0 голосов
/ 20 октября 2013

Это дерьмовое решение, не знаю, что здесь произошло. Смотрите ответ ниже с abs () для правильного.

Даже если это старый вопрос, возможно, этот ответ поможет некоторым из вас. Я хотел получить положительное или отрицательное значение числа на основе другого результата (скажем, логическое значение mustBeNegative), как я это сделал:

int number = 7;
if(mustBeNegative)
{
      number = number * 1;
}
else
{
      number = number * -1;
}

Число будет его положительным или отрицательным значением на основе значения "mustBeNegative". Если число уже было отрицательным, оно станет положительным, и наоборот.

...