2012-12-12 17 views
8

Tamsayı değerinde bir hex değerinin dize temsilini Delphi ile dönüştürmemde sorun yaşıyorum.Onaltılık değeri onaltılık değer olarak delphi dönüştürün

Abs(StrToInt64('$FC75B6A9D025CB16')) 

ama Windows'tan kalk programı kullanırsanız, sonucudur: 18191647110290852630

i işlevini kullandığınızda

$ FC75B6A9D025CB16 bana 802829546 vermek: Örneğin

Yani sorum şu: Kim doğru? ben mi yoksa calc mı?

Zaten böyle bir problem var mı?

+2

Bu arada, 802829546'nın doğru olamayacağı oldukça açık. Bir tamsayıya ait ondalık gösterim, onaltılık gösterime göre daha az basamak olamaz. –

+0

Hangi delphi sürümünü kullanıyorsunuz? Delphi XE'de beklenen sonucu olan kodunuzu kullanarak 255096963418698986 olsun ... – whosrdaddy

+0

@Andreas, FC ile başlayan - negatif sayı olabilir, daha kısa olabilir :-) –

cevap

2

Delphi6 üzerinde çalıştığım ve bu sürümde Uint64 türü bulunmadığından "DFF Kitaplığı" adlı bir Delphi kitaplığı kullanmam gerekiyordu.
Main page

İşte ondalık değerin bir dizeye onaltılık değer bir dize dönüştürmek için benim kod:

Sen birimde kullanımlara UBigIntsV3 eklemeniz gerekir.

function StrHexaToUInt64Str(const stringHexadecimal: String): string; 
var 
    unBigInteger:TInteger; 
begin 
    unBigInteger:=TInteger.Create; 
    try 
    // stringHexadecimal parameter is passed without the '$' symbol 
    // ex: stringHexadecimal:='FFAA0256' and not '$FFAA0256' 
    unBigInteger.AssignHex(stringHexadecimal); 
    //the boolean value determine if we want to add the thousand separator or not. 
    Result:=unBigInteger.converttoDecimalString(false); 
    finally 
    unBigInteger.free; 
    end; 
end; 
7

Numara, imzalı bir 64 bitlik sayı olarak temsil edilmek için çok büyük.

FC75B6A9D025CB16h = 18191647110290852630d 

mümkün olan en büyük imzalı 64 bitlik değeri 802829546 burada açıkça yanlıştır

2^63 - 1 = 9223372036854775807 
10

için dış kütüphane gerek büyük sayılarla çalışmak .

Calc, 64 bit işaretsiz bir değer döndürür (18191647110290852630d).

Delphi Int64 tip işareti olarak en yüksek bit kullanır:

Int := StrToInt64('$FC75B6A9D025CB16'); 
Showmessage(IntToStr(Int)); 

döner sonra Arnaud's answer here göz atın sen imzalı 64bit daha büyük değerlere çalışmak gerekiyorsa

doğrudur -255096963418698986 değer veriyoruz.

İlgili konular