我在C ++编程课程中,我正在参加练习考试。其中一个问题是"在标准数学中,0是x = -x的唯一值。但是,在C中,有两个这样的值。它们是什么?"
我知道其中一个是0.另一个是什么?可能的最低负数?谢谢!
答案 0 :(得分:3)
但是,在C中,有两个这样的值。它们是什么?
这种说法是错误的。
对于int
值,唯一值x == -x
为x = 0
。
-INT_MIN
,因为-INT_MIN
会调用未定义的行为。
请注意,对于浮点(IEEE-754),0.0
,+0.0
和-0.0
有两个不同的值,此表达式会产生1
:
0.0 == -0.0
答案 1 :(得分:2)
这两个值(至少在我的机器上)是:-2147483648
和0
。
这可以通过一个小型测试程序来证明:
#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
对于一个补码,这些位简单地反转,并且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整数和浮动值是不同的。