C++转C#中ulong移位操作报错问题求助
解决C++到C#迁移中ulong移位操作的CS0019错误
我来帮你拆解这个问题,你的代码主要有两个导致错误的点,咱们一步步解决:
错误原因分析
类型不匹配引发CS0019
你在C#里把d定义成了long(有符号64位整数),而0xffffffffffffffff是ulong(无符号64位整数)。C#不允许直接对有符号和无符号整数类型使用&位运算符,这就是你看到CS0019错误的核心原因——运算符&无法在long和ulong之间进行运算。非法的移位位数
当data_bits_first_frame = 0时,64 - data_bits_first_frame = 64。C#规定,对64位整数类型(不管有符号还是无符号)进行移位操作时,移位位数必须小于64(范围是0-63)。直接写0xffffffffffffffff >> 64会触发编译错误,因为这个移位位数是非法的。
修正后的代码
首先,把d的类型改成ulong,和原C++代码的unsigned long long对应,避免有符号/无符号的类型冲突;然后处理移位位数为64的特殊情况:
// 用UL后缀声明无符号64位常量,和C++的unsigned long long匹配 ulong d = 1158552107947655168UL; int dat_shift = 8; int data_bits_first_frame = 0; // 处理移位位数为64的特殊情况 ulong mask = data_bits_first_frame == 0 ? 0xffffffffffffffff : (0xffffffffffffffff >> (64 - data_bits_first_frame)); ulong dat = (d >> dat_shift) & mask;
额外说明
- 原C++代码中,
unsigned long long移位64位的行为是未定义的,但很多编译器会把它当作移位0位处理。在C#里我们显式处理这种情况,让代码行为更清晰且符合语言规范。 - 如果你必须保留
d为long类型,也可以先把它强制转换为ulong再进行移位:((ulong)d >> dat_shift) & mask,不过更推荐直接用ulong来匹配原C++的无符号类型,减少不必要的类型转换。
内容的提问来源于stack exchange,提问作者Xabarass
相关产品推荐
相关产品推荐

