对于两个int值x = -x?

时间:2014-05-08 19:35:20

标签: c

我在C ++编程课程中,我正在参加练习考试。其中一个问题是"在标准数学中,0是x = -x的唯一值。但是,在C中,有两个这样的值。它们是什么?"

我知道其中一个是0.另一个是什么?可能的最低负数?谢谢!

5 个答案:

答案 0 :(得分:3)

但是,在C中,有两个这样的值。它们是什么?

这种说法是错误的。

对于int值,唯一值x == -xx = 0

无法计算

-INT_MIN,因为-INT_MIN会调用未定义的行为。

请注意,对于浮点(IEEE-754),0.0+0.0-0.0有两个不同的值,此表达式会产生1

 0.0 == -0.0

答案 1 :(得分:2)

这两个值(至少在我的机器上)是:-21474836480

这可以通过一个小型测试程序来证明:

#include <limits.h>
#include <stdio.h>

int main(){
    int i;
    for (i = INT_MIN; i < INT_MAX; i++) {
        if (i == -i) printf("%d\n", i);
    }

    return 0;
}

这里实际发生的是由使用two's complement的有符号整数的表示引起的:

  

该范围内最小数字的二进制补码不具有否定数字的预期效果。例如,8位系统中的-128的二进制补码产生相同的二进制数。这是因为128的正值不能用8位有符号二进制数表示。


然而,所有这些都说,正如其他人所提到的,这种行为可能与平台和架构有关。它可能对教育目的有用,但我不会编写依赖于任何此类行为的程序。

答案 2 :(得分:1)

C允许三个带符号的整数编码:

  • 二的补充
  • 一个补充
  • 符号/幅值

虽然除了最深奥或古老的架构之外的所有架构都使用两个补码(related question)。

两个补充

以2位整数范围-2到1的简化示例。要更改二进制补码中的符号,请反转这些位并添加一位。所以:

n   invert  +1(-n)
00    11    00  ---  0 == -0
01    10    11
10    01    10  --- -2 == -2
11    00    01

One's Complement

对于一个补码,这些位简单地反转,并且ranbe为-1到+1。

n   invert(-n)
00    11  
01    10  
10    01  
11    00  

这里有两个编码为零(-0和+0),因此没有值为n == -n

符号/幅值

在符号/幅度中,符号位发生变化:

n   !sign(-n)
00    10  
01    11  
10    00  
11    01

再次没有n == -n的值(并且还有两个编码为零)。

答案 3 :(得分:0)

这取决于架构。如果负数表示为2的补码,那么最小的数字将符合x==-x的条件。除此之外,你没有。

答案 4 :(得分:-3)

确实,在c中有两个数字是x == - x 。 一个是0 == - 0(整数) 。 第二个是0.0 == - 0.0(浮动值) 。 在c整数和浮动值是不同的。