Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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 了解问题-不使用分支最多两个数字_C_Bit Manipulation - Fatal编程技术网

C 了解问题-不使用分支最多两个数字

C 了解问题-不使用分支最多两个数字,c,bit-manipulation,C,Bit Manipulation,最后,给出了无分支两个数的最大值问题的解 r = y + ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // min(x, y) r = x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // max(x, y) 对于上述解决方案,提到了一些错误/限制。我想清楚地了解这一点。请详细说明以下几点- 在什么情况下会导致溢出? 为

最后,给出了无分支两个数的最大值问题的解

r = y + ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // min(x, y)
r = x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // max(x, y)
对于上述解决方案,提到了一些错误/限制。我想清楚地了解这一点。请详细说明以下几点-

在什么情况下会导致溢出? 为什么需要对签名和未签名进行打字? 如果x超过y超过INT_MAX或x小于y超过INT_MIN,则会发生溢出。例如,如果INT_MAX为32767,x为32760,y为−20,那么x-y的数学值将是32780,但这大于32767,因此发生溢出

一个建议的修复方法是用无符号x-无符号y替换x-y,因为无符号算术是按字大小进行模运算的,例如16位无符号的模65536。因此,无符号算术生成的结果具有相同的位模式,就好像2的补码有符号算术是在没有溢出的情况下执行的一样

请注意,轮班仍存在一些问题。>>sizeofint*CHAR_位-1旨在通过将整数中的位数右移一个,从而产生正x-y的所有0位或负x-y的所有1位。但是,一旦转换为无符号,移位将是逻辑插入0位,而不是算术复制符号位。而且,即使我们转换回有符号整数,C标准也不能保证算术移位

另一种选择是:

r = x - ((unsigned) x - y & -(((unsigned) x - y) >> sizeof(int) * CHAR_BIT - 1));
这将使用产生0或1的无符号移位,然后对产生所有0位或所有1位的移位求反


然后,将=右侧的整个表达式的结果转换为r的类型,即int。如果为负,则结果由实现定义。不过,在这一点上,我们可能不得不接受一些依赖于实现的行为。这种比特攻击的全部目的是解决某些硬件的性能问题,因此,想要它的全部动机取决于实现。

您应该将链接页面中的所有相关文本粘贴到您的问题中。这两个问题都在该页面上得到了明确的回答。我投票将此问题作为主题外的问题结束,因为这在link@harold:请引用链接中明确说明的文本在哪种情况下会发生溢出。@harold:这说明需要先决条件,但没有说明原因。因此,对于什么条件会导致溢出的问题,这并不是一个明确的答案。你弄明白但没有完全阐明的事情是不明确的。学习者询问它们的原因是,它们对他们来说并不明显,即使它们对你来说很简单。@Aconcagua:有些东西是必要的,但转换回有符号实际上是不够的,因为C标准不能保证产生预期的结果。我将添加一些文本。我认为在未签名的情况下进行移位,然后进行否定比较好。移位将产生0或1,基本上是x-y的高位,然后求反将产生所有0位或所有1位。