2012-04-24 11 views
5

मैं डेल्फी में एक निरंतर परिभाषित करने के लिए कोशिश कर रहा हूँ:इंट 64 निरंतर घोषित कैसे करें?

const 
    FNV_offset_basis = 14695981039346656037; 

और मैं त्रुटि मिलती है: पूर्णांक लगातार बहुत बड़ी

Note:14,695,981,039,346,656,037 decimal is equal to 0x14650FB0739D0383 hex.

कैसे मैं इस Int64 लगातार घोषणा कर सकते हैं?

कुछ अन्य बातों मैं कोशिश की है:

const 
    FNV_offset_basis: Int64 = 14695981039346656037; 
    FNV_offset_basis = Int64(14695981039346656037); 
    FNV_offset_basis: Int64 = Int64(14695981039346656037); 


var 
    offset: LARGE_INTEGER; 
begin 
    //recalculate constant every function call 
    offset.LowPart = $739D0383; 
    offset.HighPart = $14650FB0; 

सुधार

मेरे मौलिक धारणा गलत था।

चिपकाया जा रहा है 14695981039346656037 विंडोज 7 कैलक्यूलेटर में, और हेक्स में परिवर्तित करने, मुझे विश्वास है कि 14695981039346656037 की हेक्स बराबर 0x14650FB0739D0383 है का नेतृत्व किया:

enter image description here

यह गलत है।

तो जब मैं उच्च बिट के साथ एक 16 अंकीय हेक्स मान देखा, सेट नहीं, मैं इसे एक 64-बिट में फिट सकता प्रकल्पित पूर्णांक पर हस्ताक्षर किए।

असल में हेक्स समकक्ष 14695981039346656037 है ... कुछ और। रोब, तुम सही थे! (शायद)

+0

आप की कोशिश की है: 'FNV_offset_basis = $ 14650FB0739D0383;' –

+0

के संभावित डुप्लिकेट [कैसे Delphi7 में एक अहस्ताक्षरित 64-बिट पूर्णांक परिभाषित करने के लिए?] (Http://stackoverflow.com/questions/6378107/how-to-define -न-हस्ताक्षरित -64-बिट-पूर्णांक-इन-डेल्फी 7) – RRUZ

+1

रिकॉर्ड के लिए: "FNV_offset_basis = 14695981039346656037" डेल्फी XE2 में काम करता है। – Giel

उत्तर

11

प्रश्न में आपका हेक्स रूपांतरण गलत है। वह संख्या वास्तव में $ cbf29ce484222000 है और एक हस्ताक्षरित 64 बिट पूर्णांक में फिट नहीं है। इसका प्रतिनिधित्व करने के लिए आपको एक हस्ताक्षरित 64 बिट पूर्णांक की आवश्यकता होगी। डेल्फी 5 में कोई हस्ताक्षरित UInt64 नहीं है और इसलिए आप भाग्य से बाहर हैं। कोई अभिन्न डेटा प्रकार नहीं है जो डेल्फी के आपके संस्करण में उस संख्या का प्रतिनिधित्व कर सकता है।

यदि आप जो चाहते हैं वह आपको हस्ताक्षर मूल्य के रूप में थोड़ा पैटर्न की व्याख्या कर सकता है। उस स्थिति में आपके पास ऋणात्मक संख्या होगी।

+0

नंबर पर हस्ताक्षर किए गए हैं, और एक इंट 64 में हस्ताक्षर किए गए हैं। –

+0

यह फिट नहीं है। यह cbf29ce484222000 –

+0

है आप सही हैं। मूल रूप से मुझे केवल 64-बिट्स को 64-बिट वैरिएबल में स्टोर करने की आवश्यकता है जो लंबे समय तक 'मॉड' ऑपरेशन करने के लिए पर्याप्त है (लेकिन मूल रूप से)। यह मानते हुए कि यह * हस्ताक्षरित * 64-बिट पूर्णांक है, तो '$ cbf29ce484222000' का दशमलव मान क्या है? –

5

यह संख्या एक हस्ताक्षरित 64-बिट पूर्णांक धारण से बड़ी है। क्या आपने इसके बजाय UInt64 का उपयोग करने का प्रयास किया है?

+2

डेल्फी 5 (1 999) और 7 (2002) दोनों में 'Int64' है, लेकिन न तो' UInt64' है। आधुनिक डेल्फी संस्करण हालांकि, करते हैं। :) –

5

मुझे 64-बिट (हस्ताक्षरित) संख्या रखने के लिए केवल 64-बिट चर की आवश्यकता थी। मैं अभी भी इसे पूरा करने डेल्फी के Int64 उपयोग कर सकते हैं, लेकिन चाल मेरी जरूरत स्थिरांक घोषित करने के लिए कैसे किया गया था:

जबकि मैं (मुझे सही हेक्स मान को खोजने के लिए डेव और रोब के लिए धन्यवाद)

const 
    FNV_offset_basis: ULARGE_INTEGER = (LowPart: $cbf29ce4; HighPart: $84222000); 

बजे, कडाई के Int64 का उपयोग नहीं, मैं एक Int64 उपयोग कर रहा हूँ:

var 
    hash: Int64; 
begin 
    hash := FNV_offset_basis.QuadPart; 

    for i := 1 to Length(s) do 
    begin 
     hash := hash xor Byte(s[i]); 
     hash := UInt64Mul(hash, 1099511628211);  
    end; 

    Result := UInt64mod(hash, map.Length); 
end; 
कुछ सावधानी से गढ़ी गई UInt64Xxx गणित दिनचर्या के साथ

:

function UInt64mod(const Dividend: Int64; const Divisor: DWORD): DWORD; 
var 
    d2: LongWord; 
    remainder: LongWord; 
begin 
    //Upper half of dividend cannot be larger than divisior, or else a #de divide error occurs 
    //Keep multiplying by two until it's larger. 
    //We fixup at the end 
    d2 := Divisor; 
    while d2 < u.HighPart do 
     d2 := d2 * 2; 

    asm 
     MOV EDX, ULARGE_INTEGER(Dividend).HighPart; 
     MOV EAX, ULARGE_INTEGER(Dividend).LowPart; 
     MOV ECX, d2; 

     //EAX := EDX:EAX/r/m32, EDX=remainder 
     DIV ECX; 
     MOV remainder,EDX 
    end; 

    //Fixup for using larger divisor 
    Result := remainder mod Divisor; 
end; 

मैं पाठक के लिए अभ्यास के रूप में कार्यान्वयन UInt64Mul छोड़ दूंगा।

-1

विंडोज 7 कैलक्यूलेटर दोषपूर्ण है और बिना किसी चेतावनी के आखिरी अंक को स्ट्रिप करता है, कैलकुलेटर वास्तव में 64 बिट्स में गणना करने में सक्षम नहीं है, भले ही QWord चुना गया हो। यह केवल विंडोज 7 में एक इंट 64 कैलकुलेटर प्रतीत होता है और यह पर्याप्त अंक प्रदर्शित नहीं कर सकता है और बस उन्हें पूरी तरह से गलत मान पर स्ट्रिप्स कर सकता है। दिलचस्प बात यह है कि विंडोज एक्सपी कैलकुलेटर में यह बग नहीं है।

और 14695981039346656037 के वास्तविक हेक्स मूल्य 0xCBF29CE484222325 भी 14695981039346656037 = (20921 * 465383 * 1509404459) अब एक सबूत यह कैलक्यूलेटर के साथ यह गणना करने के लिए कोशिश करते हैं और आप -3750763034362895579 मिल जाएगा के रूप में (हस्ताक्षरित) के बजाय 14695981039346656037 (अहस्ताक्षरित) में है प्रोग्रामर मोड, लेकिन यह वैज्ञानिक मोड में सही होगा।

+0

@Amenom आपको अपने खातों को मर्ज करने का प्रयास करना चाहिए। कृपया [संपर्क फ़ॉर्म] का उपयोग करें (http://stackoverflow.com/contact) – Vogel612

0

मैं एक WMI कॉल उस प्रकार Uint64 का एक संस्करण लौटे डेल्फी 5. द्वारा समर्थित नहीं था यह सोचते हैं कि Int64 परिणाम मैं उम्मीद कर रहा था, 1- मैं एक विस्तारित में typecasted और संग्रहीत लौटे संस्करण के लिए पर्याप्त उचित था तक (वास्तविक प्रकार), 2- मैंने "ट्रंक" फ़ंक्शन का उपयोग किया जो आवश्यक होने पर विस्तार से एक Int64 देता है।

बिल्कुल वही नहीं जो आप चाहते हैं लेकिन वास्तविक प्रकारों पर विचार करने से किसी को "असंभव" डेल्फी 5 गणित प्राप्त करने में मदद मिल सकती है।

संबंधित मुद्दे