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); // 好,不扩展符号.
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现