2016-11-08 7 views
1
중 하나는 두 개의 번호를 추가

나는펄 : 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; 

코모도 쇼가있는 경우 $sum0xffffff00000008

만약 내가 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 - 이것들을 살펴 줘서 고마워. 이것은 나를 미치게했다. 교훈을 얻었습니다 - Komodo가 시계 창에서 보여주는 가치에 대해서는 실제로 알지 못합니다. – Mathai

+1

해결책은 가능한 경우 'sprintf "% X", $ sum' 표현식을 만드는 것입니다. – ikegami

+2

https://github.com/Komodo/KomodoEdit/issues/new (Komodo 편집 레포로 Komodo IDE 티켓을 등록하십시오) 버그를 보내주십시오. 이 문제를 파헤치는 위대한 업적. 티켓을 만들려면이 포럼 스레드를 연결하십시오. – cgchoffman