如果x是无符号int类型,那么这些语句中是否存在差异:

return (x & 7);


return (-x & 7);

我知道对无符号值求反会得到max_int - value的值。但是,在任何特定的边界条件下,上述两个语句的返回值(即真/假)是否存在差异,或者它们在功能上是否相同?

最佳答案

测试代码:

#include <stdio.h>

static unsigned neg7(unsigned x) { return -x & 7; }

static unsigned pos7(unsigned x) { return +x & 7; }

int main(void)
{
    for (unsigned i = 0; i < 8; i++)
        printf("%u: pos %u; neg %u\n", i, pos7(i), neg7(i));
    return 0;
}

测试结果:
0: pos 0; neg 0
1: pos 1; neg 7
2: pos 2; neg 6
3: pos 3; neg 5
4: pos 4; neg 4
5: pos 5; neg 3
6: pos 6; neg 2
7: pos 7; neg 1

对于4(以及0)的特定情况,没有区别;对于其他值,有区别。您可以扩展输入的范围,但输出将产生相同的模式。

关于c - 一元整数4的一元否定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20293599/

10-11 21:06