【发布时间】:2020-08-18 19:05:13
【问题描述】:
JLS 这么说
移位表达式的类型是左手的提升类型 操作数。
如果左侧操作数的提升类型是 int,那么只有 右手操作数的五个最低位用作移位 距离。就好像右手操作数受到 按位逻辑与运算符 & (§15.22.1) 与掩码值 0x1f (0b11111)。因此,实际使用的移位距离总是在 范围为 0 到 31,包括 0 到 31。
如果左操作数的提升类型是长的,那么只有 右手操作数的六个最低位用作移位 距离。就好像右手操作数受到 按位逻辑与运算符 & (§15.22.1) 与掩码值 0x3f (0b111111)。因此,实际使用的移位距离总是在 范围 0 到 63,包括 0 到 63。
因此,如果我使用 (byte)100<<100 和 (short)100<<100 之类的强制转换运算符明确地创建一个字节和一个短操作数,那么右操作数的可用位是什么?
编辑:如果操作数已经使用强制转换运算符转换为不同的(较小的)类型,它是否会进行数字提升(一元/二元)?如果是这种情况,您将如何解释具有字节变量 b1 = (byte)(b2 + b3) 的表达式,因为在强制转换之后,字节结果可能会根据数字提升转换为 int?
【问题讨论】:
标签: java casting type-conversion bit-shift jls