我有时会用这个:
$ perl -e "printf \"%d\", ((~18446744073709551592)+1)"
24
Run Code Online (Sandbox Code Playgroud)
我似乎无法用 Raku 做到这一点。我能得到的最好的是:
$ raku -e "say +^18446744073709551592"
-18446744073709551593
Run Code Online (Sandbox Code Playgroud)
那么:我怎样才能让 Raku 给我和 Perl 相同的答案呢?
必须使用 Liz 的自定义操作(我的变体\xc2\xb9)(在她下面的评论中)。
\nsub prefix:<\xc2\xb2^>(uint $a) { (+^ $a) + 1 }\n\nsay \xc2\xb2^ 18446744073709551592; # 24\nRun Code Online (Sandbox Code Playgroud)\n我最初的“半受过教育的疯狂猜测”\xc2\xb2 结果被 @zentrunix 接受,也是 Liz\ 操作的基础:
\nsay (+^ my uint $ = 18446744073709551592) + 1; # 24\nRun Code Online (Sandbox Code Playgroud)\n\\o/ 有效!\xc2\xb3
\n\xc2\xb9 我翻转了两个字符操作,因为我想遵循该+^形式,将其默读为“两个补码”,并避免它看起来像^2.
\xc2\xb2 一种思路是关于特定的整数。我看到那18446744073709551592接近2**64. 另一个问题是,在 Perl 中,整数的精度是有限的,除非你采取其他措施来改变它们,而在 Raku 中,整数是任意精度的,除非你采取其他措施来改变它们。第三条思路来自于阅读前缀+^文档,其中提到“使用所需数量的字节将数字转换为二进制”,我将其解释为表示表示在某种程度上很重要。唔。如果我尝试一个int变量怎么办?溢出。(当然。)uint?答对了。
\xc2\xb3 我不知道这个解决方案是否因错误的原因而正确。或者更糟。值得关注的一件事是,uint在 Raku 中定义为对应于用于编译 Raku 代码的 Raku 编译器支持的最大本机无符号整数大小。uint64_t(IIrc。)在今天的实践中,这意味着 Rakudo 和任何底层平台都成为目标,而且我认为在几乎所有情况下这几乎肯定意味着 C。我想perl有一些类似的依赖于平台的定义。perl所以我的解决方案,如果它是一个合理的解决方案,大概只能移植到 Raku 编译器(今天的实践中意味着 Rakudo)与二进制文件(今天的实践中意味着 P5P 的)一致的程度。perl)在某些平台上运行时一致的程度。另请参阅下面@p6steve 的评论。
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |