我想寫一個需要40位整數的程式。 我撰寫程式的機器有 64 位整數,但我想在程式中檢查是否有 64 位整數可用。
我怎樣才能有效地做到這一點呢?
在一個64位的機器上,這似乎是可行的:
~0 >=2**63
這在不同的架構上是否安全(讀作:"可移植")?
考慮到這個問題,我還想知道Perl編譯器,或解釋器是否能使這些結果在未來的Perl版本中出現問題:
DB<2> sub bittest { use integer; return ((1 << $_[0]) >> $_[0] ) ! = 0; }
DB<3> x bittest 31.
0 1
DB<4> x bittest 63
0 1
DB<5> x bittest 64
0 ''
uj5u.com熱心網友回復:
~0在64位系統上是18446744073709551615,所以
~0 == 18446744073709551615。
~0 == 0xFFFFFFFF # (16 F)
是有效的測驗,看看你是否在一個64位系統上。
我只在32位和64位系統上使用過Perl,但如果有39位和41位的系統,要使用40位的整數,你只需要~0至少是2**40-1,或者:
~0 >= 0xFFFFFFFF # (10 F)/span>
uj5u.com熱心網友回復:
如果你需要計算機意義上的整數(IV/UV),你需要它們至少有40位大小。
~0 >= 2**40-1
或者
use Config qw( %Config )/span>;
$Config{uvsize} >=8
uvsize指的是這種整數的位元組大小。
如果你使用以下任何一種方法,你就需要這個:
- 作為運算元的數字。
- 數字作為位運算子的運算元 。
- 數字作為
.../...的運算元。
pack 'Q'/unpack 'Q'。
- 大于0xFFFF_FFFF 的十六進制字。
如果你需要數學意義上的整數,至少有40位精度的浮點數(NV)也可以。
use Config qw( %Config )/span>;
$Config{uvsize} >= 8 || eval($Config{nv_overflows_integers_at}) > = 2**40
包括eval($Config{nv_overflows_integers_at})在內的每個整數都可以精確地表示為一個NV。
請注意,Perl 的每個版本都應該支持至少 53 位的精度。
例如,eval($Config{nv_overflows_integers_at})在我的構建中評估為9007199254740992,根據log(9007199254740992)/log(2),這對應于53位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311365.html
標籤:
上一篇:為什么我得到的錯誤。未匹配(在regex中;由<--這里標記?
下一篇:為什么除法被決議為正則運算式?
