C 检查输入是否为最大的2';s补整数
如果C 检查输入是否为最大的2';s补整数,c,bit-manipulation,bitwise-operators,C,Bit Manipulation,Bitwise Operators,如果x是最大的2的补码,则2*t溢出为0,但如果x为-1,则其也为0,因此我们使用对其进行异或运算!计算结果为1的t。因此,我们必须得到1,但不知何故,输出是0。这段代码基本上是错误的。有符号溢出是未定义的行为,不能保证给出任何形式的确定性结果 要检查一个数字是否是“可能的最大值”,您最好将其与limits.h中的INT\u MAX进行比较。或者,如果愿意,请将其与(int)((1u)进行比较 当x为INT_MAX时,(x+x+1)变为-1,剩下的就是检查x是否为-1。如果允许常数,您可以执行以
x
是最大的2的补码,则2*t
溢出为0,但如果x
为-1,则其也为0,因此我们使用对其进行异或运算!计算结果为1的t
。因此,我们必须得到1,但不知何故,输出是0。这段代码基本上是错误的。有符号溢出是未定义的行为,不能保证给出任何形式的确定性结果
要检查一个数字是否是“可能的最大值”,您最好将其与limits.h中的INT\u MAX
进行比较。或者,如果愿意,请将其与(int)((1u)进行比较
当x为INT_MAX时,(x+x+1)变为-1,剩下的就是检查x是否为-1。如果允许常数,您可以执行以下操作
int isTmax (int x) {
return !(~(x + x + 1) | !(~x));
}
int isTmax (int x)
{
return !(((unsigned) x) ^ 0x7fffffff);
}
否则,你可以这样做
int isTmax (int x) {
return !(~(x + x + 1) | !(~x));
}
int isTmax (int x)
{
return !(((unsigned) x) ^ 0x7fffffff);
}
只允许使用这些运算符!、~、&、^、|、+。@raqeebkhan为什么要限制“!、~、&、^、|、+.-”。希望不是一门编程课程。不,这是从一本书(计算机系统:程序员的角度)开始的。我跟随它来自学系统编程。@raqeebkhan好的,所以不要==,写一些愚蠢的东西,比如return!(INT\u MAX-x);
。恭喜你,你把代码弄得乱七八糟,除了增加潜在的bug之外,什么都没有得到。@raqeebkhan提高你的知识是很好的,但这是一堂如何正确使用C的课(依赖未定义的行为)不是一个很好的系统编程课。考虑另一本书和好运。评论不是用于扩展讨论的;这个对话一直是。如果整数溢出,它是未定义的行为。它可以是1,但它也可以是任何其他数字。