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); // 好,不扩展符号.
}

在此修复

posted @   zjh6  阅读(32)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示