2016-11-08 46 views
1

如果我有的Perl:兩數相加,其中一個是超過32位

my $hex_str = "fffff00000000"; 

my $hex_val = hex($hex_str); 

my $sum = $hex_val + 5; 

$sum是我所期望的 - 0xfffff00000005

如果我有

my $hex_str = "ffffff00000000"; 

my $hex_val = hex($hex_str); 

my $sum = $hex_val + 5; 

科莫多節目$sum正在0xffffff00000008

如果我hav Ë

my $hex_str = "fffffff00000000"; 

my $hex_val = hex($hex_str); 

my $sum = $hex_val + 5; 

科莫多顯示$sum0xfffffff00000000

有人能向我解釋爲什麼我獲得了第二和第三的情況下意外的值?

>perl -V:use64bitint 
use64bitint='define'; 

>perl -V:ivsize 
ivsize='8'; 

>perl -V:archname 
archname='MSWin32-x64-multi-thread'; 
+0

什麼是$ Config {ivsize} – ysth

+0

它是8。那是什麼意思? – Mathai

+0

這是它用於整數的實際字節數; use64bitint並不可靠。 – ysth

回答

2

您不顯示用於打印$ sum的代碼;這可能是問題所在,但我無法複製它。無論如何,如果您啓用了警告,那麼對hex()的調用會給您一個Hexadecimal number > 0xffffffff non-portable警告。

你可以這樣做:

use strict; 
use warnings; 
use Math::BigInt; 

my $hex_str = "ffffff00000000"; 
my $hex_val = Math::BigInt->new("0x$hex_str"); 
my $sum = $hex_val + 5; 
print $sum->as_hex, "\n"; 
+0

謝謝!你是對的,啓用了警告,我收到了這條消息。 – Mathai

+1

改爲使用[Math :: Int64](https://metacpan.org/pod/Math::Int64)。 –

+1

該警告僅僅意味着它不適用於32位版本,但它應該在$ Config {ivsize}爲8時起作用! – ikegami

2

看來,科莫多(所使用的IDE)或它採用的是使用雙精度浮點存儲64位值與perl交換數據,從而導致什麼失去精確度。

這會導致觀察窗口顯示$sum錯誤的值,但在使用Perl內部的printf "%X\n", $sum;或使用Kodomo觀察窗口中的sprintf "%X", $sum時會顯示正確的值。

+0

@ikegami - 謝謝你看這些。這讓我瘋狂。獲得的教訓 - 不要真正瞭解科莫多在監視窗口中顯示的值。 – Mathai

+1

解決方法是創建一個表達式'sprintf「%X」,$ sum',如果可以的話。 – ikegami

+2

請提交一個錯誤https://github.com/Komodo/KomodoEdit/issues/new(是的,你使用Komodo Edit repo提交了Komodo IDE門票)。偉大的工作挖掘到這個問題順便說一句。如果你創建一張票,請確保鏈接這個論壇主題。 – cgchoffman

相關問題