2010-03-01 16 views
14

मैं सिर्फ यह सुनिश्चित करने के लिए सी ++ साक्षात्कार प्रश्नों का एक गुच्छा से गुजर रहा हूं कि मुझे कुछ भी स्पष्ट नहीं है। अब तक मैं कुछ भी है कि मैं पहले से ही पता नहीं था, नहीं मिला है इस को छोड़कर:एक अभ्यास साक्षात्कार के प्रश्न का उत्तर

long value; 
//some stuff 
value &= 0xFFFF; 

सवाल "? क्या इस कोड के साथ गलत क्या है" है और संकेत देता है कि यह लक्ष्य आर्किटेक्चर के साथ कुछ करने के लिए है।

जब तक कि जवाब सिर्फ "मूल्य प्रारंभ नहीं किया गया" है, मुझे कोई समस्या नहीं दिखाई दे रही है। जहां तक ​​मैं कह सकता हूं, यह सिर्फ मूल्य के 2 कम से कम महत्वपूर्ण बाइट्स को मास्क कर रहा है, और long कम से कम 2 बाइट होने की गारंटी है, इसलिए वहां कोई समस्या नहीं है।

क्या यह संभवतः long लक्ष्य आर्किटेक्चर पर केवल 2 बाइट्स हो सकता है, और आप साइन बिट खो रहे हैं? या शायद 0xFFFF int और int केवल 2 बाइट है?

अग्रिम धन्यवाद।

+6

शून्य कर दिया गया है, मैं ऐसे नियोक्ता के लिए काम नहीं करता जिसके लिए ऐसे अस्पष्ट प्रश्नों का उत्तर देने की आवश्यकता है। यह एक अंतहीन मुद्दा नहीं है (अंतहीन मतभेद अंकगणित में प्रकट नहीं होते हैं), लेकिन एक साइन-एक्सटेंशन एक, जिसे मैंने जॉन नोवेलर के लिए +1 दिया था। आम तौर पर इस तरह की अप्रत्याशित परेशानी से बचने के लिए हस्ताक्षर किए गए सभी बिट ऑपरेशन करना एक अच्छा विचार है। – Tronic

+0

ध्यान दें कि 'लंबा' कम से कम 32 बिट्स है। 8 बिट प्लेटफार्मों पर, यह 4 बाइट्स है (बेशक, यह अभी भी गैर-2 अपूर्णताओं के लिए साइन समस्याएं पैदा कर सकता है)। –

+0

आपके उत्तर, जोहान्स के साथ क्या हुआ? –

उत्तर

15

इस कोड के साथ यह समस्या है कि है यह एक हस्ताक्षरित मूल्य पर एक बिट-वार ऑपरेशन करता है। नकारात्मक मानों पर ऐसे परिचालनों के परिणाम विभिन्न पूर्णांक प्रस्तुतियों के लिए काफी भिन्न होते हैं।

उदाहरण के लिए निम्नलिखित कार्यक्रम पर विचार करें:

#include <iostream> 

int main(void) 
{ 
    long value; 
    value = -1; // Some stuff 
    value &= 0xffff; 
    std::cout << "Value = " << value << std::endl; 
} 

एक two's-पूरक वास्तुकला परिणाम है पर:

Value = 65535 

एक one's-पूरक वास्तुकला परिणाम है पर:

Value = 65534 

एक साइन-एंड-परिमाण वास्तुकला पर परिणाम है:

Value = 1 
+2

बिल्कुल। यह सीईआरटी रिपोर्ट देखें: https://www.securecoding.cert.org/confluence/display/seccode/INT13-C.+Use+bitwise+operators+only+on+unsigned+operands। विशेष रूप से, सी मानक (जैसा कि संदर्भित किया गया है) के अनुसार, हस्ताक्षरित मूल्यों पर बिटवाईर संचालन के परिणाम कार्यान्वयन-परिभाषित हैं। –

-1

मुझे बिग-एंडियन बनाम लिटिल-एंडियन जैसे लगता है। http://en.wikipedia.org/wiki/Endianness

+4

इस छोटे संदर्भ को देखते हुए अंतहीनता की अत्यधिक संभावना नहीं है। इसके लिए एक अंतहीनता मुद्दा होने के लिए, वहां 'ऑपरेशन का' पता होना चाहिए - या उन पंक्तियों के साथ कुछ। –

+2

मूल्य-संदर्भ ऑपरेशन endianness पर निर्भर नहीं है। जब तक आप [कच्ची] स्मृति का निरीक्षण शुरू नहीं करते हैं, तब तक सी ++ में अंतहीनता को देखना असंभव है। – AnT

7

यह जानना मुश्किल है कि साक्षात्कारकर्ता ने आपको क्या कहना है। हम बस अनुमान लगाना है।

मेरा अनुमान है कि कुछ आर्किटेक्चर पर, 0xFFFF एक हस्ताक्षरित 16 बिट मान होगा, जबकि लंबे समय तक 32 बिट मान पर हस्ताक्षर किया जाएगा। जब आप निरंतर विस्तार करते हैं ताकि इसका उपयोग लंबे मूल्य को मुखौटा करने के लिए किया जा सके, तो यह संकेत बढ़ाया जाएगा और 0xFFFFFFFFl बन जाएगा, जो कि आप बिल्कुल भी नहीं चाहते हैं।

परिशिष्ट: सही ढंग से compilers कि मैं वर्तमान में उपयोग के सभी तीन पर लिखा काम करता है के रूप में कोड, तो यह वास्तव में क्या साक्षात्कारकर्ता इरादा पता लगाने की कोशिश की एक अनुमान लगाने का खेल है। एक ठीक से मानकों के अनुरूप 16 बिट संकलक भी सही कोड उत्पन्न होगा, तो हम अनुमान लगा वहाँ कुछ हम याद है कि क्या है, चाहे उदाहरण वास्तव में टूट नहीं है, या के साथ छोड़ दिया जाता है कि क्या साक्षात्कारकर्ता एक बार एक 16 बिट संकलक कि के रूप में 0xFFFF व्यवहार करेगी इस्तेमाल किया एक लंबे समय तक विस्तार करने के लिए मजबूर जब एक हस्ताक्षरित मात्रा। उससे पूछना दिलचस्प होगा।

+1

संभव नहीं है। सी ++ '0xFFFF' में एक हस्ताक्षरित 16-बिट मान नहीं हो सकता है। यह मान हस्ताक्षरित 16-बिट प्रकार की सीमा में फिट नहीं है, जिसका अर्थ है कि संकलक को * हस्ताक्षरित * 16-बिट प्रकार का उपयोग करने की आवश्यकता होगी। – AnT

+0

यह एक _guess_ लोग है। हम सभी जानते हैं कि कोड के साथ कुछ भी गलत नहीं है, और साक्षात्कारकर्ता सिर्फ _thought_ वह टूटा कोड दिखा रहा था। –

+2

@ जॉन Knoeller: नहीं, क्या आप को समझने में विफल करने लगते है वहाँ चीजें हैं जो यथोचित compilers के बीच अलग (और यहां तक ​​कि गैर-संगत कभी कभी) होने की उम्मीद की जा सकती हैं, और चीजें हैं जो यथोचित लागू किया जाना उम्मीद कर रहे हैं हैं कि सही ढंग से। * यह * उन सभी चीजों में से एक है जो सभी कंपाइलरों द्वारा सही तरीके से कार्यान्वित किए जाते हैं। कोई भी कंपाइलर्स जो इस विशिष्ट बिट अधिकार को नहीं मिला था, लंबे समय से अस्तित्व से हँसे थे। किसी भी मामले में, इस तरह की मौलिक चीज़ को सही ढंग से कार्यान्वित करने में एक बाधा तुरंत और अनिवार्य रूप से एक कंपाइलर को "एक सी ++ कंपाइलर" कहने से अयोग्य घोषित करता है। – AnT

1

क्या मैं कह सकता हूं, इस कोड में कुछ भी गलत नहीं है जब तक कि आसपास के कोड का संदर्भ या इरादा ज्ञात न हो!

+1

ठीक है, मैंने इसे ओपी में नहीं लिखा था, लेकिन सवाल वास्तव में पूछा गया था कि "इस कोड के साथ * क्या हो सकता है?", तो वास्तव में यह आपको कुछ धारणाएं करने के लिए कह रहा है कुछ उचित संदर्भ के बारे में। –

0

यह अंधेरे में एक शॉट हो सकता है लेकिन यह मानते हुए कि लंबे बनाम int मुद्दा नहीं है (दूसरों ने जवाब देने के उत्तर पोस्ट किए हैं) और 0xFFFF इस प्रकार की आवश्यक राशि को शामिल करता है, है ना? बस value = 0xFFFF बना रहे हैं और बिट मैनिप्ल्यूशन की कोई आवश्यकता नहीं है? थोड़ा हेरफेर अनावश्यक नहीं है?

एकमात्र अन्य चीज जो मैं देख सकता हूं वह यह है कि यदि प्रश्न पूछने वाला व्यक्ति आपको यह महसूस करना चाहता था कि लंबे समय में लापता डेटा लापता 0xFFFF का उपयोग करके प्रभावित नहीं होगा।

मेरे लिए कैसे सवाल यहां प्रस्तुत किया जा रहा है के आधार पर पूछने के लिए एक सा एक सवाल का निराला भर आता है या हो सकता है यह सिर्फ इतना स्पष्ट है कि हम सब से अधिक सोच रहे हैं यह :)

+1

क्योंकि 'ऑपरेटर और =' का उपयोग करने से वैरिएबल को वह मान असाइन नहीं किया जाता है। यह पहले से ही चर में जो कुछ भी है उसके साथ बिट्स को जोड़ता है - इससे कोई फर्क नहीं पड़ता कि यह क्या है। यदि 'मान' में' 0xDEAD' है तो इसमें अभी भी 'ऑपरेटर और =' के कॉल के बाद भी शामिल होगा। –

0

मुझे संदेह है कि हम सभी बहुत मेहनत कर रहे हैं।

इस कोड के साथ गलत क्या है कि मूल्य आरंभ नहीं किया जाता है। सवाल यह है - क्या आपको एनालिज्ड वैल्यू पर इस्तेमाल होने पर & = (या + =, - =/= आदि) का अर्थ है।

मूल्य तो आरंभ नहीं हो जाता, तो व्यवहार में अच्छी तरह से परिभाषित किया गया है। कम से कम महत्वपूर्ण 16 बिट संरक्षित हैं, बाकी को

+0

मुझे लगता है कि हर कोई यह मान रहा है कि '// कुछ सामान' में वैरिएबल प्रारंभिकता है। – Tanzelax

+0

संकेत इंगित करता है कि यह ऐसा कुछ है जो असामान्य वास्तुकला पर गलत हो सकता है, इसलिए मुझे संदेह है कि यह प्रारंभिक है, और मुझे संदेह है कि & = अप्रासंगिक है। –

+0

तो मेरी दूसरी टिप्पणी खड़ी है - यदि मूल्य प्रारंभ किया गया है तो व्यवहार अच्छी तरह से परिभाषित किया गया है – pm100

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