d正短的右移
unittest {
const ushort tru = 1028;
ushort ee = tru;
ee <<= 5U;
ee >>= 5U;
assert(((tru << 5U) >> 5U) == ee);
}
出现该问题是因为(ee>>=5),尽管ee是个正类型,是按有符号右移完成.
一步步:
赋值式上说,
a op= b
//==
a = cast(typeof(a))(a op b)
因此,重写(ee>>=5)为:
ee = cast(ushort)(ee >> b);
右移式上说,整数提升操作数.
ee = cast(ushort)(cast(int)ee >> b)
//或
ee = cast(ushort)((ee & 0x0000_FFFF) >> b)
然后,>>是有符号右移.但符号位是0,所以是正右移,但是编译器生成了个有符号右移.
符号扩展未完成时,也会出现此问题.下面是测试代码:
struct TestType(T)
{
import std.traits : Unsigned;
alias U = Unsigned!T;
T t = T.min; // 示例:字节版-128
U u = U.max/2 + 1; // 示例:字节版128
}
void main()
{
alias T = long; // int, short, byte
TestType!T v1, v2;
enum bits = T.sizeof * 8 - 1;
v1.t >>= bits;
assert(v1.t == -1); //好,因为正类型
v1.u >>= bits;
assert(v1.u == 1); // 好,因为正类型
v2.t >>>= bits;
assert(v2.t == 1); // 好,不扩展符号.但对`字节/整/短`的`-1`
v2.u >>>= bits;
assert(v2.u == 1); // 好,不扩展符号.
}
浙公网安备 33010602011771号