2012-02-09 12 views
11

हस्ताक्षरित इनट्स पर शिफ्ट ऑपरेशंस एक हस्ताक्षरित परिणाम क्यों देते हैं, लेकिन छोटे हस्ताक्षरित ऑपरेटरों पर संचालन के परिणामस्वरूप हस्ताक्षरित int होता है?ऑपरेशन के दौरान शिफ्ट ऑपरेशंस हमेशा एक हस्ताक्षरित int क्यों होता है <32 बिट्स

int signedInt = 1; 
int shiftedSignedInt = signedInt << 2; 

uint unsignedInt = 1; 
uint shiftedUnsignedInt = unsignedInt << 2;  //OK. unsigned result 

short signedShort = 1; 
int shiftedsignedShort = signedShort << 2; 

ushort unsignedShort = 1; 
uint shiftedUnsignedShort = unsignedShort << 2; //CS0266: Can't cast int to uint 

sbyte signedByte = 1; 
int shiftedSignedByte = signedByte << 2; 

byte unsignedByte = 1; 
uint shiftedUnsignedByte = unsignedByte << 2; //CS0266: Can't cast int to uint 
+0

और अधिक अंतर्दृष्टि के लिए 'uint shiftedUnsignedByte = (uint) unsignedByte << 2U;' जोड़ें। –

उत्तर

11

shift operators (बाएं पाली) केवल इन मामलों के लिए पूर्वनिर्धारित रहे हैं:

int operator <<(int x, int count); (1) 
uint operator <<(uint x, int count); (2) 
long operator <<(long x, int count); (3) 
ulong operator <<(ulong x, int count); (4) 

अभिव्यक्ति uint shiftedUnsignedShort = unsignedShort << 2 के रूप में (1) -ST मामले (implicit up-casting from ushort to int और (int)2) व्याख्या की है, तो यह अवैध कास्टिंग पर एक चेतावनी प्रदर्शन किया (int परिणाम से ushort तक कोई अंतर्निहित कलाकार नहीं है)।
उसी स्थिति में हम uint shiftedUnsignedByte = unsignedByte << 2 के लिए देख सकते हैं। इसने (1) -स्ट केस के रूप में भी व्याख्या की (बाइट से int और (int)2 से अंतर्निहित अप-कास्टिंग, लेकिन परिणामस्वरूप मूल्य का कोई अंतर्निहित कलाकार नहीं है)।

आप नीचे दिए गए दृष्टिकोण का उपयोग कर इन समस्याओं को हल कर सकते हैं:

uint shiftedUnsignedShort = (uint)unsignedShort << 2 //force use the (2)-nd shift operator case 
uint shiftedUnsignedByte = (uint)unsignedByte << 2; //force use the (2)-nd shift operator case 
0

Wikipedia<< और >> के अनुसार दो अलग-अलग ऑपरेटरों प्रतिनिधित्व करते हैं। एक तार्किक बदलाव vor ulong और uint और int और लंबे के लिए एक अंकगणितीय बदलाव।

अब मेरा अनुमान है (!) यह है कि "अपरिभाषित" ushort या ubyte को int में बजाय एक यूंट में डाला जाता है।

क्षमा करें, लेकिन यह सब मैं पेशकश कर सकता हूं।

3

Shift operators MSDN लेख में उल्लेख है कि पूर्वनिर्धारित पारी ऑपरेटरों केवल पूर्णांक, uint, लंबे, Ulong प्रकार के लिए मौजूद नहीं है। अन्य सभी प्रकार के लिए वे अधिभारित हैं। सभी शिफ्ट परिचालनों के लिए दूसरा ऑपरेंड हमेशा int प्रकार का होगा। इसलिए शिफ्ट ऑपरेशन करने से पहले किसी भी छोटे प्रकार को हमेशा int में डाला जाता है।

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