3 回答
TA贡献1835条经验 获得超7个赞
对于负操作数,<<
具有未定义的行为,其结果>>
是实现定义的(通常为“算术”右移)。<<
并且>>
在概念上不是按位运算符。它们是算术运算符,等同于对其明确定义的操作数乘以2或乘以适当的幂。
对于真正的位运算符^
,~
,|
,和&
,它们在(可能促进)类型操作数的值的位表示操作。对于带符号表示形式的每个可能选择(二进制补码,1补码或符号幅度),其结果都得到了很好的定义,但在后两种情况下,如果实现将“负零”视为实现,则结果可能是陷阱表示形式表示为陷阱。就我个人而言,我几乎总是将无符号表达式与按位运算符一起使用,以使结果在值(而非表示形式)方面100%定义明确。
最后,请注意,此书面答案仅适用于C.C和C ++是非常不同的语言,尽管我不太了解C ++,但我理解它在某些方面可能与C有所不同。
TA贡献1801条经验 获得超16个赞
<<
负值向左移动具有不确定的行为;>>
负值的右移给出了实现定义的结果;的结果
&
,|
和^
运营商在值的按位表示来定义的。允许用C表示负数的三种可能性:二进制补码,二进制补码和符号幅度。当这些运算符用于负值时,实现所使用的方法将确定数值结果。
请注意,带符号位1和所有值位为零的值(用于二进制补码和符号幅度),或带符号位和所有值位为1的值(对于1的补码)被明确允许为陷阱表示,在这种情况下如果您对这些运算符使用了会生成此类值的参数,则行为是不确定的。
TA贡献1848条经验 获得超6个赞
C89标准根据位位置定义了左移带符号数字的行为。如果有符号和无符号类型都没有填充位,则无符号类型所需的行为,再加上正符号类型与无符号类型共享相同表示的要求,将意味着符号位紧靠最高有效位的左侧。 。
在C89中,对于没有填充位的二进制补码实现,-1 << 1为-2,对于没有填充位的二进制补码实现为-1 << 1。如果存在任何没有填充位的符号幅度实现,则-1 << 1将等于2。
C99标准将负值的左移更改为“未定义行为”,但是从原理上没有任何线索可以说明原因(甚至根本没有提及更改)。C89要求的行为在某些补码实现中可能不理想,因此允许这些实现自由选择更好的东西是有意义的。我没有证据表明该标准的作者并不打算让质量为2的补码实现继续提供C89所要求的相同行为,但是不幸的是,他们实际上并未这么说。
- 3 回答
- 0 关注
- 1245 浏览
添加回答
举报