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

我知道有>>符号整数的行为可能与实现有关(特别是当左操作数为负时)。

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


慕容3067478
浏览 1246回答 3
3回答

qq_花开花谢_0

对于负操作数,<<具有未定义的行为,其结果>>是实现定义的(通常为“算术”右移)。<<并且>>在概念上不是按位运算符。它们是算术运算符,等同于对其明确定义的操作数乘以2或乘以适当的幂。对于真正的位运算符^,~,|,和&,它们在(可能促进)类型操作数的值的位表示操作。对于带符号表示形式的每个可能选择(二进制补码,1补码或符号幅度),其结果都得到了很好的定义,但在后两种情况下,如果实现将“负零”视为实现,则结果可能是陷阱表示形式表示为陷阱。就我个人而言,我几乎总是将无符号表达式与按位运算符一起使用,以使结果在值(而非表示形式)方面100%定义明确。最后,请注意,此书面答案仅适用于C.C和C ++是非常不同的语言,尽管我不太了解C ++,但我理解它在某些方面可能与C有所不同。

侃侃尔雅

<<负值向左移动具有不确定的行为;>>负值的右移给出了实现定义的结果;的结果&,|和^运营商在值的按位表示来定义的。允许用C表示负数的三种可能性:二进制补码,二进制补码和符号幅度。当这些运算符用于负值时,实现所使用的方法将确定数值结果。请注意,带符号位1和所有值位为零的值(用于二进制补码和符号幅度),或带符号位和所有值位为1的值(对于1的补码)被明确允许为陷阱表示,在这种情况下如果您对这些运算符使用了会生成此类值的参数,则行为是不确定的。

慕勒3428872

C89标准根据位位置定义了左移带符号数字的行为。如果有符号和无符号类型都没有填充位,则无符号类型所需的行为,再加上正符号类型与无符号类型共享相同表示的要求,将意味着符号位紧靠最高有效位的左侧。 。在C89中,对于没有填充位的二进制补码实现,-1 << 1为-2,对于没有填充位的二进制补码实现为-1 << 1。如果存在任何没有填充位的符号幅度实现,则-1 << 1将等于2。C99标准将负值的左移更改为“未定义行为”,但是从原理上没有任何线索可以说明原因(甚至根本没有提及更改)。C89要求的行为在某些补码实现中可能不理想,因此允许这些实现自由选择更好的东西是有意义的。我没有证据表明该标准的作者并不打算让质量为2的补码实现继续提供C89所要求的相同行为,但是不幸的是,他们实际上并未这么说。
打开App,查看更多内容
随时随地看视频慕课网APP