2010-01-07 10 views
20

मैं इंटेल कंप्यूटर (Win7 64-bit) पर चल रहा हूं और जो मैंने पढ़ा है उसके अनुसार इंटेल लिटिल-एंडियन का उपयोग कर रहा है। मैं निम्नलिखित कोड के साथ सी # में बाहर इस प्रयास करें:IsLittleEndian फ़ील्ड झूठी रिपोर्ट करता है, लेकिन यह लिटिल-एंडियन होना चाहिए?

byte[] b2 = new byte[] { 0, 1 }; 
short b2short = BitConverter.ToInt16(b2, 0); 

और == 256 एक छोटी-एन्डियन से अपेक्षा के अनुरूप b2short।

तो मैंने पढ़ा है कि .NET में, क्या BitConverter.IsLittleEndian endian प्रणाली का उपयोग कर रहा है, और जब मैं दृश्य स्टूडियो में चर की जाँच यह झूठी रिपोर्ट, यानी यह छोटे-नहीं है एन्डियन को प्रदर्शित करना चाहिए।

क्या 64-बिट ओएस के साथ इसका कोई संबंध नहीं है? कोई विचार?


संपादित करें: मेरे सहयोगी, जो मुझ से भर में बैठता है, एक ही परीक्षण (विन Vista 32-बिट) किया था और एक ही परिणाम

मिला

संपादित करें 2: यह वास्तव में अजीब बात है । जब भी मैं कोड चलाता हूं, और बिटकॉन्टर के बाद टूट जाता है, तो IsLittleEndian == false। लेकिन, यदि मैं लाइन कंसोल जोड़ता हूं। राइटलाइन (बिटकोनवर्टर.इस्लाइट इंडियन); बाद में यह सच है:

byte[] b2 = new byte[] { 0, 1 }; 
short b2short = BitConverter.ToInt16(b2, 0); 
Console.WriteLine(BitConverter.IsLittleEndian); 
// Now the IsLittleEndian is true 

लेकिन एक बार मैं Console.WriteLine को दूर यह झूठी फिर से है।

मैं यह भी जोड़ सकता हूं कि अगर मैं "Console.WriteLine" IsLittleEndian == सत्य पर तोड़ता हूं, लेकिन यदि मैं पूरी तरह से लाइन को हटा देता हूं तो यह गलत है।


संपादित करें 3: के रूप में मार्क Gravell ने कहा, यह कुछ समय-बग होना चाहिए। यदि मैं परिवर्तनीय BitConverter.IsLittleEndian का उपयोग करता हूं, तो यह प्रारंभ होता है, अगर मैं नहीं (और इसे तोड़ने पर इसे देखता हूं) इसे प्रारंभ नहीं किया गया है और इस प्रकार झूठा ...

+0

कौन सा इंटेल है? क्या यह आईए 64 हो सकता है? हालांकि मुझे आश्वस्त किया गया है कि आईए 64 पर भी यह LE का उपयोग कर सकता है। –

+0

कंसोल दो। राइटलाइन - "firstfieldinit" के बारे में मेरा बिंदु देखें ... –

+0

मैं इंटेल i920 प्रोसेसर का उपयोग कर रहा हूं ... – Ted

उत्तर

20

मुझे आश्चर्य है कि यह एक समय बग है, शायद "पहले फ़ील्डिनिट" से संबंधित है ... आप मूल्य को कैसे देख रहे हैं? यह संभव है कि प्रकार-प्रारंभकर्ता (BitConverter के लिए) वीएस डीबगर द्वारा ट्रिगर नहीं किया जा रहा है (जो कवर के तहत देख रहा है, तो बोलने के लिए)। विशेष रूप से false फ़ील्ड के लिए डिफ़ॉल्ट मान है ...

IsLittleEndian स्थिर क्षेत्र स्थिर निर्माता में सेट है; और जिस समय एक प्रारंभकर्ता निष्पादित करता है वह है ... भविष्यवाणी करना बहुत मुश्किल है। यदि आप डीबगर का उपयोग कर रहे हैं, तो सभी दांव बंद हैं। एक ही रास्ता मज़बूती से इस फ़ील्ड का मान की जाँच करने के कोड के माध्यम से (जब CLR कुछ बिंदु पर प्रारंभकर्ता चलने से पहले यह आवश्यक है):

bool isLittleEndian = BitConverter.IsLittleEndian; 

डिबगर/वॉच विंडोज़ पर विश्वास मत करो आदि

+0

मैं कोड या कंसोल तोड़कर इसे देख रहा हूं। राइटलाइन। यह हो सकता है, कोड को तोड़ने पर इसे प्रारंभ नहीं किया गया है, लेकिन जब मैं कोड में इसका उपयोग कर रहा हूं, तो इसे कंसोल। राइटलाइन। – Ted

+0

के बाद से वह यह गलत है अगर वह लाइन पूरी तरह निकाल देता है, यह मेरे लिए सुराग को लगता है कि वह पहले लाइन पर ब्रेकप्वाइंट डाल दिया है, जो * पहले ट्रिगर करेगा * BitConverter प्रयोग किया जाता है कहते हैं। मुझे आश्चर्य है कि क्या होगा यदि उसने ToInt16 को कॉल करने के बाद सिर्फ एक और पंक्ति जोड़ा, जिसने बिटकॉन्टर से संबंधित कुछ भी नहीं किया, और उस रेखा पर तोड़ दिया, तो क्या यह सच साबित होगा? –

+0

लास: यदि बिटकोनवर्टर.इस्लिटलएंडियन का उपयोग किया जाता है (कंसोल। राइटलाइन) की तरह इसे लाइन निष्पादित करने से पहले भी शुरू किया जाता है। यह, बिटकॉन्टर का उपयोग करने से पहले भी यह सच है। – Ted

2

आप इसे कैसे देख रहे हैं?

using System; 

public class Test 
{ 
    static void Main() 
    { 
     Console.WriteLine(BitConverter.IsLittleEndian); 
    } 
} 

क्या कि प्रिंट करता है:

उदाहरण के लिए, इस छोटे से सांत्वना अनुप्रयोग चलाने के? क्या आप हार्डवेयर और ओएस का उपयोग कर रहे हैं के बारे में विवरण दे सकते हैं?

+0

"यह एक चर के बजाय एक संपत्ति है" - वास्तव में, यह एक स्थिर क्षेत्र है। –

+0

@Marc: हाँ, मैं बस उस बिट को हटा दूंगा, इसे अलग से देखा। मुझ पर शर्म की बात है। –

+0

जॉन: कृपया अपने प्रश्न के उत्तर के रूप में उपरोक्त "संपादित करें 2" पढ़ें। व्यवहार बहुत अजीब है ... – Ted

0

मार्क की तरह कहते हैं कि यह एक समय बग लगता है। स्टार्टअप पर मूल्य पर "peek" पर वीएस डीबगर का उपयोग करके यह झूठा होता है, लेकिन अगर मैं इसे एक संदेश बॉक्स में प्रिंट करता हूं तो यह सच हो जाता है।

5

रेमंड चेन expanded answer to the question देता है।

डीबगर से एक सदस्य पढ़ना कि सदस्य प्रारंभ करने में कोड निष्पादित नहीं करता है:

यह का सार है कि है।

तो जब आप विजुअल स्टूडियो में फ़ील्ड देखते हैं, तो यह गलत रिपोर्ट करेगा क्योंकि स्थैतिक प्रारंभकर्ता अभी तक नहीं चला है। हालांकि, यदि आप कोड में फ़ील्ड का उपयोग करते हैं, तो स्थिर प्रारंभकर्ता रन होगा, जिससे फ़ील्ड वास्तविक सही मान वापस कर देगा।

+3

"इस सवाल का जवाब * बहुत समान * है?" उन्होंने इस प्रश्न का उत्तर उनके पद पर उत्तर के रूप में किया;) – nemec

+2

@ एनमेक - हाहा, आप सही हैं। मैंने लिंक के माध्यम से क्लिक नहीं किया, मैंने बस उस वेब सर्च को दोहराया जिसे उसने उल्लेख किया था। यह इंगित करने के लिए उत्तर अपडेट किया गया कि उसने जवाब देने के बजाय उत्तर का विस्तार किया। – FriendlyGuy

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