java算术右移和逻辑右移_移位操作符(<,>)算术还是逻辑在C中?

5441acda3150725394d6339e74dd00d8.png

开满天机

考虑i和n分别是移位运算符的左操作数和右操作数;i,在整数提升后,是T..假设n待在[0, sizeof(i) * CHAR_BIT)-不确定-我们有这样的情况:| Direction  |   Type   | Value (i) | Result                   || ---------- | -------- | --------- | ------------------------ || Right (>>) | unsigned |    ≥ 0    | −∞ ← (i ÷ 2ⁿ)            || Right      | signed   |    ≥ 0    | −∞ ← (i ÷ 2ⁿ)            || Right      | signed   |    < 0    | Implementation-defined†  || Left  (<n=X/2n=trunc(Xχ2)n)X<0,X>n=地板(X×2)n)哪里÷是数学除法,/整数除法。让我们看一个例子:37)10 = 100101)237 2=18.537/2=18(约18.5比0)=10010)2[算术右移结果]-37)10 = 11011011)2(考虑两个补码,8位表示法)-37χ2=-18.5-37/2=-18(约18.5比0)=11101110)2[不是算术右移的结果]-37>1=-19(向−∞舍入18.5)=11101101)2[算术右移结果]如盖伊·斯蒂尔指出,这种差异导致了多个编译器中的错误..在这里,非负(数学)可以映射到无符号和有符号的非负值(C);两者被处理相同,右移它们是通过整数除法完成的。因此,逻辑和算术在左移和右移中的非负值是等价的;在负值的右移中,它们的不同之处就在于它们的右移。操作数和结果类型标准C99§6.5.7:每个操作数都应该有整数类型。整数提升在每个操作数上执行。结果的类型是提升的左操作数。如果右操作数的值为负值,或大于或等于提升的左操作数的宽度,则行为未定义。short E1 = 1, E2 = 3;int R = E1 <E2的结果是E1右移E2位置。如果E1具有无符号类型,或者e1具有符号类型和非负值,则结果的值是e1/2商的整数部分。E2..如果E1有符号类型和负值,则结果值是实现定义的。对于无符号和有符号的非负值的右移位非常直接;空位填充了零。对于符号负值,右移的结果是实现定义的。也就是说,像GCC和Visual C+通过保留符号位实现右移作为算术移位.结语与Java不同,Java有一个特殊的运算符>>>用于与通常情况不同的逻辑移位>>和<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值