2012-12-12 58 views
8

में हेक्स str को दशमलव मान में कनवर्ट करें मुझे डेल्फी के साथ पूर्णांक मान में एक हेक्स मान के स्ट्रिंग प्रस्तुति को परिवर्तित करने में कोई समस्या है।डेल्फी

$ FC75B6A9D025CB16 मुझे 802,829,546 देना जब मैं समारोह का उपयोग करें::

Abs(StrToInt64('$FC75B6A9D025CB16')) 

लेकिन अगर मैं Windows से calc प्रोग्राम का उपयोग, परिणाम है: 18191647110290852630

उदाहरण के लिए

तो मेरा सवाल है: कौन सही है? मैं, या कैल्क?

क्या किसी के पास पहले से ही इस तरह की समस्या है?

+2

वैसे, यह स्पष्ट है कि 802829546 सही नहीं हो सकता है। एक पूर्णांक का दशमलव प्रतिनिधित्व हेक्साडेसिमल प्रतिनिधित्व से कम अंकों का नहीं हो सकता है। –

+0

आप किस डेल्फी संस्करण का उपयोग कर रहे हैं? डेल्फी एक्सई में मुझे आपके कोड का उपयोग करके 2550 9 66934186 9 8 9 86 मिल गया है जो अपेक्षित परिणाम है ... – whosrdaddy

+0

@ एंड्रियास एफसी से शुरू हो रहा है - यह नकारात्मक संख्या हो सकता है, तो यह छोटा हो सकता है :-) –

उत्तर

2

मुझे "डीएफएफ लाइब्रेरी" नामक डेल्फी लाइब्रेरी का उपयोग करना पड़ा क्योंकि मैं डेल्फी 6 पर काम करता हूं और टाइप Uint64 इस संस्करण में मौजूद नहीं है।
Main page

यहाँ दशमलव मान के एक सूत्र के हेक्साडेसिमल मान की एक स्ट्रिंग को बदलने के लिए मेरे कोड है:

आप अपने इकाई में अपने उपयोग के लिए UBigIntsV3 जोड़ने की जरूरत है।

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

संख्या 64-बिट संख्या के रूप में प्रदर्शित होने के लिए बहुत बड़ी है।

FC75B6A9D025CB16h = 18191647110290852630d 

सबसे बड़ा संभव पर हस्ताक्षर किए 64-बिट मूल्य

2^63 - 1 = 9223372036854775807 
10

वास्तव में के लिए बाहरी पुस्तकालय की जरूरत है 802829546 स्पष्ट रूप से यहाँ कुछ गड़बड़ है ।

कैल्क 64 बिट हस्ताक्षरित मान (18191647110290852630d) देता है।

डेल्फी Int64 प्रकार संकेत के रूप में उच्चतम बिट का उपयोग करता है:

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

रिटर्न मूल्य -255096963418698986 जो सही

है आप पर हस्ताक्षर किए 64 बिट से बड़ा मान के साथ काम करने की जरूरत है, तो Arnaud's answer here की जाँच करें।