假设我们有以下代码:
int j = -1 & 0xFF;
j
中的结果值可以是基于底层表示的以下值之一:
System Value
Two's complement 0xFF
One's complement 0xFE
Sign/Magnitude 0x01
但C中的&
,|
和^
运算符总是以二进制补码的形式定义(因此j
总是等于0xFF
}),或者它们是根据系统的基础表示来定义的?
答案 0 :(得分:2)
它们是根据实际的比特表示来定义的。来自C11 final draft:
二进制&的结果operator是操作数的按位AND(即,当且仅当设置了转换后的操作数中的每个相应位时,才会设置结果中的每个位。)
...
^运算符的结果是操作数的按位异或(即,当且仅当设置转换的操作数中的相应位中的一个时,才设置结果中的每个位。)
...
|的结果operator是操作数的按位包含OR(也就是说,当且仅当已设置转换后的操作数中的至少一个相应位时,才会设置结果中的每个位。)