C位运算符示例
给出以下功能:
int boof(int n) {
return n + ~n + 1;
}
这个函数返回什么? 我无法准确理解传递给它的内容。 如果我调用boof(10),它是否将10转换为2,然后对二进制数进行按位运算?
最近我有一个问题,我想答案应该是0,但我不知道如何证明。
注意:我知道每个按位运算符是如何工作的,我对输入处理的方式更加困惑。
谢谢!
按位操作不会将数字的底层表示更改为基数2 - 无论如何,CPU上的所有数学运算均使用二进制操作完成。
这个函数做什么是取n,然后将它加到它自己的补码负表示中。 这基本上否定了输入。 你放入的任何东西都等于0。
让我用8位数字来解释,因为这样更易于直观显示。
10以二进制表示为00001010。
负数存储在二进制补码中(注意数字并加1)
所以10的(〜n + 1)部分看起来像这样:
11110101 + 1 = 11110110
所以如果我们拿n +〜n + 1:
00001010 + 11110110 = 0
注意,如果我们将这些数字相加,我们会得到一个左进位,它将设置溢出标志,结果为0.(将正数和负数相加并不意味着溢出表示异常!)
请参阅二进制算术中的CARRY和OVERFLOW标志
当n
是一个int,
n +〜n will always result in an
一个int,
它具有所有的位。
严格地说,将1加到这样一个int
的行为将取决于平台上有符号数字的表示。 C标准支持signed int
3个表示:
对于Two's Complement机器(今天使用的绝大多数系统)来说,结果将为0,因为所有位设置为1的int
。
在我的补充机器上(我认为今天很少见),结果将是1,因为所有位设置为0或-0(负零)或未定义行为的int
。
一个有符号幅度的机器(实际上还有哪些还在使用?),一个int
设置的所有位都是一个负数,幅度最大(因此实际值取决于int
的大小)。 在这种情况下,将1加1会导致负数(确切的值,也取决于用于表示int
的位数)。
请注意,上面忽略了某些实现有可能使用n + ~n
来捕获各种可能的位配置。