为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
慕容3067478 2019-10-19 15:24:59
我知道有>>符号整数的行为可能与实现有关(特别是当左操作数为负时)。怎么样的人:~,>>,&,^,|?当他们的操作数有符号内建类型(整数short,int,long,long long),都将结果保证是相同的(中位含量),好像他们的类型是无符号的?
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

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

对于真正的位运算符^~|,和&,它们在(可能促进)类型操作数的值的位表示操作。对于带符号表示形式的每个可能选择(二进制补码,1补码或符号幅度),其结果都得到了很好的定义,但在后两种情况下,如果实现将“负零”视为实现,则结果可能是陷阱表示形式表示为陷阱。就我个人而言,我几乎总是将无符号表达式与按位运算符一起使用,以使结果在值(而非表示形式)方面100%定义明确。

最后,请注意,此书面答案仅适用于C.C和C ++是非常不同的语言,尽管我不太了解C ++,但我理解它在某些方面可能与C有所不同。


查看完整回答
反对 回复 2019-10-19
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

  • <<负值向左移动具有不确定的行为;

  • >>负值的右移给出了实现定义的结果;

  • 的结果&|^运营商在值的按位表示来定义的。允许用C表示负数的三种可能性:二进制补码,二进制补码和符号幅度。当这些运算符用于负值时,实现所使用的方法将确定数值结果。

请注意,带符号位1和所有值位为零的值(用于二进制补码和符号幅度),或带符号位和所有值位为1的值(对于1的补码)被明确允许为陷阱表示,在这种情况下如果您对这些运算符使用了会生成此类值的参数,则行为是不确定的。


查看完整回答
反对 回复 2019-10-19
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

C89标准根据位位置定义了左移带符号数字的行为。如果有符号和无符号类型都没有填充位,则无符号类型所需的行为,再加上正符号类型与无符号类型共享相同表示的要求,将意味着符号位紧靠最高有效位的左侧。 。

在C89中,对于没有填充位的二进制补码实现,-1 << 1为-2,对于没有填充位的二进制补码实现为-1 << 1。如果存在任何没有填充位的符号幅度实现,则-1 << 1将等于2。

C99标准将负值的左移更改为“未定义行为”,但是从原理上没有任何线索可以说明原因(甚至根本没有提及更改)。C89要求的行为在某些补码实现中可能不理想,因此允许这些实现自由选择更好的东西是有意义的。我没有证据表明该标准的作者并不打算让质量为2的补码实现继续提供C89所要求的相同行为,但是不幸的是,他们实际上并未这么说。


查看完整回答
反对 回复 2019-10-19
  • 3 回答
  • 0 关注
  • 1245 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信