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
相关产品推荐
相关产品推荐

