需要解释“~0”与“2**64”(带和不带“使用整数”)

2024-02-18

我编写了一些测试程序打印的值~0 and 2**64:

#!/usr/bin/perl
use warnings;
use strict;
#use integer;
print ~0, "\n";
print 2**64, "\n";

Without use integer程序输出

118446744073709551615
1.184467440737096e+19

With use integer程序输出:

-1
1.184467440737096e+19

另一个奇怪的事情是,即使使用print int(2**64)该数字仍然以科学格式输出,就像int(...)不在那里(仍然~0没有use integer以“整数格式”输出)。

我可以使用强制整数输出printf("%u\n", ...), 然而。

(Perl 在 x86_64 上的 SLES12 SP5 5.18.2 中使用)

问题:

那么为什么是2**64有和没有的“浮动”use integer, while ~0从来没有?

use integer when ~0打印为-1,仍然满足条件~0 > 2**63(当我期望-1 not大于任何正值(例如2**63).

Update

Perl 调试器中似乎还出现了另一个奇怪的效果:2^64是奇数,并且2^64-1 is -2.

  DB<22> if (1) { use integer; print 2**64, "\n" }
1.84467440737096e+19

  DB<23> if (1) { use integer; print 2**64 - 1, "\n" }
-2
  DB<13> if (1) { use integer; printf '%x', 2**64-1, "\n" }
fffffffffffffffe
  DB<14> if (1) { use integer; printf '%x', 2**64, "\n" }
ffffffffffffffff
  DB<15> if (1) { no integer; printf '%x', 2**64, "\n" }
ffffffffffffffff
  DB<16> if (1) { no integer; printf '%x', 2**63, "\n" }
8000000000000000

那么为什么是2**64有和没有的“浮动”use integer

求幂是使用浮点数计算的,从而产生浮点数。我不知道为什么use integer不会强制将结果转换为有符号整数,但事实并非如此。这与其文档一致,文档指出该编译指示仅影响以下操作数和结果:

  • 算术运算符 (+, -, *, /, %, +=, -=, *=, /=, %=,和一元减号)
  • 比较运算符 (<, <=, >, >=, ==, !=, <=>), and
  • 按位运算符 (|, &, ^, <<, >>, |=, &=, ^=, <<=, >>=)

事实上,它专门排除了**.

电力运营商**也不受影响,因此 2 ** .5 始终是 2 的平方根。


while ~0从来没有?

机器只有对整数类型执行按位运算的操作,并且它们返回整数类型。将数字转换为浮点数是没有意义的(并且有很多理由不使用 64 位整数进行构建)。

use integer when ~0打印为-1,仍然满足条件~0 > 2**63(当我期望-1 not大于任何正值(例如2**63).

use integer导致许多运算符将值转换为 IV,并且<就是这样一个运营商。铸件2**63在我的机器上产生 -9223372036854775808 。

$ perl -M5.010 -Minteger -e'say 0 + 2**63'
-9223372036854775808
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要解释“~0”与“2**64”(带和不带“使用整数”) 的相关文章

  • Perl 如何存储/处理非常大的数字?是否应该使用模块来代替 Perl 的默认处理方法?

    我需要添加 50 位数字 因此我将它们作为 字符串 处理 并编写了自己的函数将它们相加 后来 为了它的地狱 我尝试了这个 readFile shift ARGV sub readFile my file shift contains a b
  • 我们如何确定总数? Hive 表的桶数

    我对 hadoop 有点陌生 根据我的知识桶是固定的 hive 表中的分区数和 hive 使用编号 减速机数量与总数量相同创建表时定义的存储桶数量 那么谁能告诉我如何计算总数 Hive 表中的桶数 有没有计算桶总数的公式 让我们看一个场景
  • 在 Objective-C 中使用 perl?

    CPAN 有大量非常有用的库 除了将它们移植到 Objective C 之外 是否还有在 iOS 上将 Perl 代码嵌入到 Objective C 中的方法 我对使用特别感兴趣电子表格 阅读 http kobesearch cpan or
  • Perl 构建、单元测试、代码覆盖率:一个完整​​的工作示例

    我找到的关于 Perl 构建过程 单元测试和代码覆盖率的大多数 Stackoverflow 答案都只是将我指向 CPAN 那里的文档 指向 CPAN 模块绝对没有任何问题 因为完整的文档应该位于此处 不过 在很多情况下 我很难找到完整的工作
  • 匹配有限自然数列

    我怎样才能匹配有限自然数 http en wikipedia org wiki Natural number正则表达式系列 所以 要求是 字符串包含数字和空格 作为分隔符 第一个数字是1 每个数字 第一个数字除外 等于前一个数字 1 应该是
  • Perl 脚本(或任何东西)来合计 CSV 列

    我写了 在其他人的很多帮助下 awk command https stackoverflow com questions 4159224 excel and awk disagree about csv totals 4159404 415
  • Perl Moose TypeDecorator 错误。我该如何调试?

    我最近遇到了一个问题 非常感谢您的见解 我在圣诞节前在 PerlMonks 上发布了类似的问题 并提供了一些从 MooseX Declare 切换的反馈 http www perlmonks org node id 877703 1 我现在
  • C scanf() 问题?

    在这个简单的猜数字游戏中 scanf 在 main 中第二次不起作用 如果有人能解释为什么不起作用以及如何修复它 我将非常感激 关于如何清理这段代码有什么建议吗 谢谢你 include
  • Perl 中如何释放内存?

    我的代码如下所示 my var my var new while 1 while my k v each var a sub v var A map var var new keys var new var new B sub a sub
  • 使用 Perl 循环 JSON [重复]

    这个问题在这里已经有答案了 我是 Perl 的新手 想要循环这个 JSON 数据并将其打印到屏幕上 我怎样才能做到这一点 arr Year 2012 Quarter Q3 DataType Other 3 Environment STEVE
  • 使用perl,在每行都有相同单词的情况下如何选择最后两行?

    Bini 21 89753 20 47853 20 27835 18 34952 16 23454 Bini 16 89753 14 47853 13 27835 12 34952 11 23454 Bini 10 09014 我的文件有一
  • 如何在 Java 中将区域设置格式的数字转换为 BigInteger?

    我搜索了很多 但没有任何帮助 假设我需要将 12 090 129 019 201 920 192 091 029 102 901 920 192 019 201 920 葡萄牙语组分隔符 转换为 BigInteger 值 如何进行转换 我尝
  • 如何从 R 运行带有特定模块的 perl 脚本?

    我可以从终端运行 perl 脚本 myperlscript pl 没有任何问题 但是 如果我尝试从 RStudio 中运行相同的 perl 脚本 则会出现以下错误 command lt myperlscript pl outputfile
  • Perl Tk 模块有哪些缺点?

    与在 Perl 中创建 GUI 的其他解决方案相比 Tk 模块有哪些缺点 我最近浏览了 Perl 的各种 gui 模块 这是我的总结 免责声明 最终我发现现有模块都不能满足我的需求 所以我开始编写自己的 gui 工具包 Tk 工作起来很不错
  • Perl YAML 模块无法识别标量类型

    我加载以下 yaml 文件 foo bar s 1 hx 0x34 用这段代码 use YAML qw LoadFile Dump use Data Dumper my d LoadFile test yaml print Dumper d
  • Perl 非贪婪

    我遇到非贪婪正则表达式 regex 的问题 我已经看到有关于非贪婪正则表达式的问题 但它们没有回答我的问题 Problem 我正在尝试匹配 lol 锚点的 href Note 我知道这可以通过 Perl HTML 解析模块来完成 我的问题是
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • 使用 Perl 获取 值

    因此 我有一个报告工具 可以在 HTML 文件中输出作业调度统计信息 并且我希望使用 Perl 来使用这些数据 但我不知道如何单步浏览 HTML 表 我知道如何使用 jQuery 来做到这一点 find tr each function v
  • 在perl中调用基本构造函数

    从 Perl 中的类构造函数调用基本构造函数的正确方法是什么 我见过这样的语法 my class shift my a shift my b shift my self class gt SUPER new a b return self
  • 使用 LWP::Agent 的 Perl JSON::RPC::Client

    我被要求不使用 JSON RPC Client 而是使用 LWP 进行调用 这是我的代码 Server usr bin perl use strict use lib use ServerLib use JSON RPC Server Da

随机推荐