Raku中如何实现二进制补码运算得到与Perl一致的结果
差异原因
- Perl的按位取反运算符
~默认按平台原生固定位宽(此处为64位)整型处理数值,运算时自动截断到对应位宽。传入的18446744073709551592等于2^64 - 24,在64位补码规则下取反加1,最终输出24。 - Raku默认使用任意精度整数,无固定位宽限制,前缀按位取反运算符
+^不做位宽截断,直接返回数学意义上的按位取反结果-(原值 + 1),因此直接运算会输出-18446744073709551593,与Perl结果不符。
对应Raku实现
两种写法都能得到和Perl完全一致的运算结果:
- 手动执行64位截断,模拟Perl固定位宽运算逻辑:
$ raku -e "say ((+^18446744073709551592) + 1) +& (2**64 - 1)" 24
代码中+& (2**64 -1)的作用是仅保留运算结果的低64位,与Perl自动截断到64位整型的行为完全对齐。
- 用Raku内置的64位无符号整型
uint64做类型约束,位运算会自动按64位位宽执行,无需手动截断:
$ raku -e "say (+^ (my uint64 $ = 18446744073709551592)) + 1" 24
内容的提问来源于stack exchange,提问作者zentrunix
相关产品推荐
相关产品推荐

