是否定义了有符号整数的按位运算结果?

upd*_*liu 47 c c++ bitwise-operators

我知道有>>符号整数的行为可以依赖于实现(具体来说,当左操作数为负时).

怎么样的人:~,>>,&,^,|?当他们的操作数有符号内建类型(整数short,int,long,long long),都将结果保证是相同的(中位含量),好像他们的类型是无符号的?

R..*_*R.. 45

对于负操作数,<<具有未定义的行为,并且结果>>是实现定义的(通常为"算术"右移).<<并且>>在概念上不是按位运算符.它们是算术运算符,相当于乘法或除以它们定义明确的操作数的2的适当幂.

对于真正的位运算符^,~,|,和&,它们在(可能促进)类型操作数的值的位表示操作.对于每个可能选择的有符号表示(二进制补码,一个补码或符号幅度),它们的结果都是明确定义的,但在后两种情况下,如果实现处理"负零",则结果可能是陷阱表示.表示为陷阱.就个人而言,我几乎总是使用带有位运算符的无符号表达式,因此结果在而不是表示方面100%定义良好.

最后,请注意,所写的答案可能仅适用于C. C和C++是非常不同的语言,虽然我不太了解C++,但我知道它可能在某些方面与C ...

  • @this:*见6.2.6.2整数类型*.在第2段末尾:*其中哪一个适用于实现定义,符号位为1且所有值位为零(前两个),或符号位和所有值位1(对于1) '补码),是陷阱表示或正常值.* (6认同)
  • 在二进制补码的情况下,`~INT_MAX`也被允许作为陷阱表示. (5认同)
  • 顺便说一下,请注意,根据6.2.6.1,负零(如果存在)需要与普通零操作相同,作为按位操作的操作数:*将运算符应用于具有多个对象表示的值时,使用哪个对象表示不应影响结果的值.* (5认同)
  • 这是一个有趣的观点 - 似乎暗示了支持负零的符号幅度实现上的`~~ INT_MAX == INT_MIN`. (5认同)
  • @this:C允许带有`INT_MIN == - INT_MAX`的2s补码变体.:-( (4认同)
  • 哦,是的,我总是忘记...谢天谢地,非(全范围二进制补码)实现实际上并不存在。 (2认同)
  • 是的,它确实。:-)这也使创建一致的符号/幅值实现变得更加困难,这不是一件坏事.. :-) (2认同)
  • @R ..是的,但可以两个补充允许吗?C还将两个补码定义为:*符号位具有值 - (2 M)(二进制补码);*我认为允许min == - max相等只允许一个补码和符号/幅度. (2认同)

caf*_*caf 10

  • <<值的左移具有未定义的行为;
  • >>负值的右移给出了实现定义的结果;
  • 的结果&,|^运营商在值的按位表示来定义的.C中负数的表示允许三种可能性:二的补码,一个补码和符号幅度.当这些运算符用于负值时,实现使用的方法将确定数值结果.

注意,符号位1和所有值位零(对于二进制补码和符号幅度),或符号位和所有值位1(对于一些补码)的值明确允许为陷阱表示,并且在此如果您使用这些运算符的参数来生成这样的值,则行为是未定义的.