2016-11-08 12 views
1
そのうちの1つは2つの数値を、追加

IはたPerl:32ビット以上

my $hex_str = "fffff00000000"; 

my $hex_val = hex($hex_str); 

my $sum = $hex_val + 5; 

$sum私が期待されている場合 - 0xfffff00000005

Iは

my $hex_str = "ffffff00000000"; 

my $hex_val = hex($hex_str); 

my $sum = $hex_val + 5; 

コモド番組を持っている場合$sum0xffffff00000008

もし私がhavv電子

my $hex_str = "fffffff00000000"; 

my $hex_val = hex($hex_str); 

my $sum = $hex_val + 5; 

コモドは$sum0xfffffff00000000

であることを示して

Iは、第2及び第3のケースで予期しない値を取得し、なぜ誰かが私に説明できますか?

>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を使用)、または何それはperlとデータを交換するために使用していますが、その結果、64ビットの値を格納する倍精度浮動小数点を使用していることが表示されます精度の低下で窓を見て子どもからsprintf "%X", $sumを使用するときにはPerlの中からprintf "%X\n", $sum;を使用した場合、または

これは$sumのために間違った値を表示するウォッチウィンドウを起こしますが、正しい値を示しています。

+0

@ikegami - これらを見ていただきありがとうございます。これは私にナッツをもたらした。レッスンで学んだことはコモドがウォッチウィンドウで示す価値観には本当にありません。 – Mathai

+1

解決方法は、可能であれば、 'sprintf"%X "、$ sum'という式の時計を作成することです。 – ikegami

+2

https://github.com/Komodo/KomodoEdit/issues/newにバグを報告してください(はい、Komodo IDEレポでKomodo IDEチケットを登録してください)。問題を深く掘り下げた素晴らしい仕事。チケットを作成する場合は、このフォーラムスレッドをリンクしてください。 – cgchoffman

関連する問題