C语言中是否有一种运算符可以将int、float等的符号从负数改变为正数或反之亦然?

10

我试图找到绝对值,我认为只需使用“~”或其他东西来反转符号就可以了。


如果它已经是负数怎么办?它们会抵消吗? - nickthedude
我不懂Objective-C,但根据你的问题,可能有一个库函数可以获取绝对值...如果要改变符号,那么这将是一种代码异味。 - overslacked
8个回答

25
float newValue = oldValue * -1;

或者
float newValue = -(oldValue); //() aren't needed, I just use them out of habit

如果你只使用-oldValue,至少在MSVC中,你会得到一个完全无用的警告。 - MarcusJ

13

要改变符号,将负号放在它的前面。


4
“你应该像我一样不插手这件事。”谢谢。 - Mitch Wheat
1
这是所有中最优雅的。相当不言自明。 - Paul Moore

12

使用带有-的简单否定方式是可以的,但是大多数答案忽略了OP试图进行绝对值操作的事实。对于此操作,正确的工具是整数类型使用abs(),浮点型使用fabs()。代码将非常清晰,结果将符合您的预期。(编辑:一定要阅读这些工具的文档和错误信息。正如Nick指出的那样,使用abs()否定最小的负数会返回相同的负数。)


原则上,我同意并已经为你的回答投了赞成票。当尝试去取负最小的整数时,可能合理地期望程序被终止或引发异常。请参阅链接文档中 abs() 的“BUGS”部分。 - Nick Guerrera
@Nick:abs()在iPhone上不会陷入困境;它只会返回INT_MIN。 - Stephen Canon
@Nick:这不符合C语言的精神。正如Stroustrup在类似C++的情况下所说,语言应该提供快速运算符和可能的检查运算符。如果语言提供了快速运算符,用户可以根据需要插入检查,而如果语言只提供了检查运算符,当不需要时用户无法丢弃检查并快速执行。如果您喜欢,您总是可以编写int checked_abs(int) - David Thornley
@David:我并不反对。我的意思只是你可能有一个合法的理由去编写自己的 abs() 函数以捕获这个错误。 - Nick Guerrera
@Stephen:我觉得你误读了我的评论。我是在说,虽然abs()不会陷入困境,但用户可能会期望它这样做。这是关于“结果将是您所期望的”的声明。 - Nick Guerrera

9
一元取反运算符 -(expr) 可以完全满足你的需求。
int x = -7;
int y = 7;
x = -x; // x is now 7
y = -y; // y is now -7

你提到的按位取反运算符~(expr)会翻转输入中的所有位。
如果有帮助的话,许多现有绝对值实现忽略的一个问题是,对于给定固定大小的二进制补码整数类型,对最小负值取反将导致溢出。

我刚刚看到这个标签是Objective-C。我最初的回答是针对标题的,询问是否有一个“在C中”的运算符。值得庆幸的是,“Objective-C是建立在C之上的一个薄层,并且是C的严格超集。可以使用Objective-C编译任何C程序,并在Objective-C类中自由地包含C代码。”http://en.wikipedia.org/wiki/Objective-C - Nick Guerrera

4

-x将给你x的相反数。


4
这是一个棘手的问题。改变浮点数符号的直接方法是翻转变量最高有效位的值。其他答案中列出的表示法取决于编译器,通常没问题,但并非总是如此。对于“float x”,答案是: *(unsigned int*)&x ^= (1<<31) 如果你在为像iPhone这样拥有Cortex A8处理器(或类似处理器)的设备编写代码时,想要避免使用双精度浮点数,并且在内部循环中使用浮点数时也要避免使用条件语句。因此,你可以这样做: *(unsigned int*)&x ^= ((x<0) << 31); 这将在不使用分支指令的情况下将负数变为正数。如果这是在内部循环中,它将比在iPhone上使用其他方法快5到20倍。如果不在内部循环中,那么你可能不太关心!

1

x = 0 - x;

这是什么意思?还是我理解错了?


-2

这是一个糟糕的解决方案,不确定发生了什么。请查看下面使用abs()的正确答案。

虽然这是一个旧问题,但也许这个答案会帮助到你们中的一些人。我想根据另一个结果(比如一个布尔值mustBeNegative)得出一个数字的正负值,我是这样做的:

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

根据"mustBeNegative"的值,该数字将是其正值或负值。当数字已经是负数时,它将变为正数,反之亦然。


这太过复杂,同时也是错误的。 - fishinear
是的,不确定那里发生了什么。如果有人问你在互联网上最羞愧的事情是什么?我从现在开始会指向这个答案。 - Matthijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接