Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检查输入是否为最大的2';s补整数_C_Bit Manipulation_Bitwise Operators - Fatal编程技术网

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,但它也可以是任何其他数字。