You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中uint64_t按uint16_t移位时出现异常错误求助

位棋盘移位异常问题分析与修复

问题根源

问题出在0x0000000000000001字面量的默认类型上:在C++中,该值默认是有符号32位整数(int),而非你需要的uint64_t。
当a=0x1f(十进制31)时,对32位有符号int左移31位会得到0x80000000——这是一个负数(最高位为符号位)。当这个负数被转换为uint64_t返回时,会触发符号扩展:32位负数的符号位会填充到64位的高32位,最终得到0xffffffff80000000,而非预期的0x0000000080000000。

修复方案

以下三种方案都能解决问题:

  • 方案1:给字面量添加ULL后缀,明确指定为无符号64位整数
    uint64_t endSquareFinder(uint16_t a){
        a &= 0x003f;
        return 0x1ULL << a;
    }
    
  • 方案2:将字面量强制转换为uint64_t类型
    uint64_t endSquareFinder(uint16_t a){
        a &= 0x003f;
        return static_cast<uint64_t>(0x1) << a;
    }
    
  • 方案3:先定义uint64_t类型的1再移位
    uint64_t endSquareFinder(uint16_t a){
        a &= 0x003f;
        uint64_t one = 1;
        return one << a;
    }
    

内容的提问来源于stack exchange,提问作者Michael Haney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:56:59