按位运算是否可移植?

时间:2016-09-19 22:47:41

标签: c language-lawyer bitwise-operators

假设我们有以下代码:

int j = -1 & 0xFF;

j中的结果值可以是基于底层表示的以下值之一:

    System          Value
Two's complement    0xFF
One's complement    0xFE
Sign/Magnitude      0x01

但C中的&|^运算符总是以二进制补码的形式定义(因此j总是等于0xFF }),或者它们是根据系统的基础表示来定义的?

1 个答案:

答案 0 :(得分:2)

它们是根据实际的比特表示来定义的。来自C11 final draft

  

二进制&的结果operator是操作数的按位AND(即,当且仅当设置了转换后的操作数中的每个相应位时,才会设置结果中的每个位。)
  ...
  ^运算符的结果是操作数的按位异或(即,当且仅当设置转换的操作数中的相应位中的一个时,才设置结果中的每个位。)
  ...
  |的结果operator是操作数的按位包含OR(也就是说,当且仅当已设置转换后的操作数中的至少一个相应位时,才会设置结果中的每个位。)