需要说明`~0`与`2**64`是否带有和不带有`use整数` [英] Need explanation for `~0` vs. `2**64` with and without `use integer`

查看:24
本文介绍了需要说明`~0`与`2**64`是否带有和不带有`use整数`的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一些测试程序,打印~02**64的值:

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

没有use integer程序输出

118446744073709551615
1.184467440737096e+19

使用use integer程序输出:

-1
1.184467440737096e+19

另一件奇怪的事是,即使使用print int(2**64),数字仍然以科学格式输出,就好像int(...)不存在一样(仍然是以整数格式输出的~0没有use integer)。

但是,我可以使用printf("%u ", ...)强制输出整数。

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

问题:

那么为什么2**64是带use integer和不带use integer的浮点(&Q;Float&Quot;),而~0从来不是?

和WITHuse integer~0打印为-1时,仍满足~0 > 2**63条件(当我期望-1大于任何正值时(如2**63)。

更新

似乎在Perl调试器中看到了另一个奇怪的效果: 2^64为奇数,2^64-1-2

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

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

推荐答案

那么为什么2**64浮点是use integer,而不是use integer

求幂是使用浮点数计算的,因此会产生浮点数。我不知道为什么use integer没有强制将结果强制转换为带符号整数,但它没有。这与它的文档一致,文档说明杂注只影响以下内容的操作数和结果:

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

实际上专门排除了**

幂运算符**也不受影响,因此2**.5始终是2的平方根。


~0从不是?

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

和WITHuse integer~0打印为-1时,仍满足~0 > 2**63条件(当我期望-1大于任何正值时(如2**63)。

use integer导致许多运算符将值转换为IV,<就是这样的运算符。强制转换2**63在我的计算机上产生-9223372036854775808。

$ perl -M5.010 -Minteger -e'say 0 + 2**63'
-9223372036854775808

这篇关于需要说明`~0`与`2**64`是否带有和不带有`use整数`的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆