我寫了一些測驗程式,列印~0和2**64的值:
#!/usr/bin/perl
使用警告。
use strict;
#use integer;/span>
print ~0, "
"。
print 2**64, "
"。
如果沒有使用integer,程式就會輸出
118446744073709551615
1.184467440737096e 19
使用use integer,程式輸出:
1
1.184467440737096e 19
另一個奇怪的事情是,即使使用print int(2**64),數字仍然以科學格式輸出,就像int(...)不存在一樣(仍然是~0,沒有use integer,以 "整數格式 "輸出)。
我可以用printf("%u
", ...),但是。
(Perl被用于x86_64的SLES12 SP5的5.18.2中)
問題:
。那么為什么2**64在有和沒有use integer的情況下都是 "float",而~0卻不是?
而在使用use 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) { useinteger; 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, "
" }
夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫
DB<15> if (1) { no integer; printf '%x', 2**64, "
" }
夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫
DB<16> if (1) { no integer; printf '%x', 2**63, "
" }
8000000000000000
uj5u.com熱心網友回復:
手冊頁perlop(1)在"整數算術"部分解釋說,使用整數將導致整數結果的有符號解釋,所以這將解釋118446744073709551615與-1。
另一件事是,對于64位的整數,2**64實際上是一個65位的數字,不能作為整數呈現。
所以這被解釋為浮點數字。
還有,也許是最重要的。
唯一一個我無法解釋的效果是,為什么 uj5u.com熱心網友回復: 那么為什么 指數是使用浮點數計算的,因此會產生一個浮點數。我不知道為什么 事實上,它特別排除了 冪運算子 而 機器只有對整數型別進行位操作的操作,而且它們回傳整數型別。將數字轉換為浮點數是沒有意義的(在具有 64 位整數的構建中也有很多理由不這樣做)。
標籤:~0不是/strong>2**64,而是2**64-1。
int floor(2**64 - 1)沒有像~0或0xffffffffffff那樣輸出為整數。
2**64是 "float",而沒有use integeruse integer不強制將結果投給一個有符號的整數,但它沒有。
, -, *, /, %, =, -=, *=, /=, %=, 和單數減號) <, <=, >, >=, ==, !=, <=>),和|, &, ^, <<, >> , |=, &=, ^=, <<=, >>=)**。
**也不受影響,因此,2 ** .5總是2的平方根。
~0卻永遠不是?而使用
use 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
