对于哪两个int值x=-x? 我在一个C++编程课上,我正在参加一个实践考试。其中一个问题是“在标准数学中,0是x=-x的唯一值。然而,在C中,有两个这样的值。它们是什么?”
我知道其中一个是0。另一个可能是什么?最低可能负数?谢谢 这两个值(至少在我的机器上)是:对于哪两个int值x=-x? 我在一个C++编程课上,我正在参加一个实践考试。其中一个问题是“在标准数学中,0是x=-x的唯一值。然而,在C中,有两个这样的值。它们是什么?”,c,C,我知道其中一个是0。另一个可能是什么?最低可能负数?谢谢 这两个值(至少在我的机器上)是:-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); } re
-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;
}
#包括
#包括
int main(){
int i;
对于(i=INT\u MIN;i
这里实际发生的情况是由有符号整数的表示引起的,使用:
在该范围内,二者对最小数的补码将不会产生期望的对该数求反的效果。例如,两者的互补性−8位系统中的128产生相同的二进制数。这是因为128的正值不能用8位有符号二进制数字表示
然而,正如其他人所提到的,所有这些行为可能依赖于平台和体系结构。它可能对教育目的有用,但我不会编写依赖于任何这种行为的程序。然而,在C中,有两个这样的值。它们是什么 这种说法是错误的 对于
int
值,唯一的值x==-x
是x=0
-INT\u MIN
无法计算,因为-INT\u MIN
调用了未定义的行为
请注意,对于浮点(IEEE-754),有两个不同的值表示0.0
,+0.0
和-0.0
,此表达式产生1
:
0.0 == -0.0
这取决于架构。如果负数表示为2的补码,那么最小的数字将符合
x==-x
。除此之外,还有零。在c中,确实有两个数字是x==-x
.
一个是0==-0(整数)
.
第二个是0.0==-0.0(浮动值)
.
在c中,整数和浮点值是不同的。c允许三种有符号整数编码:
- 二元补码
- 补语
- 符号/大小
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也没有值(同样还有两个编码表示零)。听起来你已经回答了你的问题。这取决于计算机体系结构。
-INT\u MIN
实际上在标准C的2补码机器上没有定义,尽管在实际实现中可能会得到INT\u MIN
(unsigned int)int_MIN
更有效。有2^n二进制表示和两个补码:一个数字是零,另一个是最小值,正如你自己回答的那样。我讨厌考试经常提出这样的问题,即使这是未定义的行为。特别是对于测试,你应该遵守标准,或者你不必怀疑人们以后是否在他们的代码中出现了各种未定义的行为。你不是在测试INT\u MAX
。我建议在循环之后进行进一步的测试:)您还可以将其设置为intmain(void)
,并添加一个final(对于C99是冗余的)返回0代码>此程序调用未定义的行为-INT_MIN
可以在一个实现中产生INT_MIN
,在另一个实现中崩溃,在另一个实现中产生42
。现在,您的测试(i@pmg和INT_MAX+1
也调用未定义behavior@user2864740IEEE-754保证0.0==-0.0
是1
。你的意思可能是对的,但你自相矛盾。-INT\u MIN
这一事实在标准C中没有定义(假设INT\u MIN<-INT\u MAX
)这意味着对于int
值,除了0
之外,是否存在x==-x
评估为真的值是标准没有回答的问题。没有要求x
使x==-x
评估为真的唯一值是0
@hvd。要求是隐含的,可以您展示了一个可能的实现,其中x==-x
对于一个不同于0
或-0
的值是真的?@ouah当然。一些实现将-INT\u MIN
的行为记录为一个扩展。这是完全有效的。@hvd一些实现扩展该语言的事实不会产生无效的程序m有效。我的观点是,对于int
值不同于0
或-0
的int
值,没有严格一致的程序可以具有x====-x
真值。特定系统使用2的补码表示并不直接暗示任何操作行为。一致性实现可以使用2的com请删除并终止一个试图计算-INT\u MIN
的程序。你们谈论的是未定义的行为。但-INT\u MIN
的未定义内容是什么?-INT\u MIN在两个补码中比INT\u MAX大1,因此无法表示。您有一个整数溢出,标准没有说明在这种情况下会发生什么,所以任何事情都可能发生,你有未定义的行为。@RaphaelMiedl你是说如果我用1234567890
添加1234567890
,程序可能会崩溃?这是根据c标准,当它没有定义行为时,编译器可以做任何他们想做的事情。Cra