2013-07-13 6 views

उत्तर

5

बनाते हैं। a:4 लिखकर आप केवल 4 बिट्स मेमोरी आवंटित करने के लिए कह रहे हैं, जो वास्तविक संख्या के लिए 3 बिट छोड़ देता है। तो हमारी प्रभावी सीमा [-8,7] है। चूंकि सभी 1 का -1 है, नकारात्मक पक्ष पर एक अतिरिक्त संख्या है। इस पर एक स्पष्टीकरण के लिए, उपर्युक्त लिंक देखें।

9, (हस्ताक्षरित) बाइनरी में है: 1001। जब आप इसे a (हस्ताक्षरित) में डालते हैं, तो आपको प्रारंभिक 1 के कारण a ऋणात्मक होता है, और निम्न संख्या 001 होती है, इसलिए हम अधिकतम नकारात्मक संख्या में 1 जोड़ते हैं, जिससे हमें -7 प्रदान करते हैं।

यदि आप केवल 4 बिट्स में नंबर 9 स्टोर करना चाहते हैं, तो आपको unsigned int का उपयोग करने की आवश्यकता है, जो आपको [0, 15] की एक श्रृंखला प्रदान करेगा।

संपादित करें:
मामले में किसी को भी पता लगाना 1001 कैसे हस्ताक्षर किए से जूझ रहा है हमें -7 देता है, निम्नलिखित पर विचार:

1111 -1 है के बाद से, कुछ चर value = -1 करते हैं। स्थिति मैं, मैं कहाँ = 0 है पर {0,1:

एक नकारात्मक के मूल्यों पता लगाने के लिए (हस्ताक्षरित) int num, हमें निरूपित मैंnum में जाने एक्स:

एक्स मैं कम से कम महत्वपूर्ण बिट)},

फिर, हर एक्स मैं = 0 के लिए, घटाना 2 मैं value से

उदाहरण:

1001:

value = -1 - 2 - 2 = -7

+0

बिटफील्ड में 'int' डिफ़ॉल्ट रूप से' हस्ताक्षरित int 'हो सकता है। ऐसा लगता है कि ओपी के मामले में नहीं है, लेकिन यह दस्तावेज पढ़ने के लिए कभी दर्द नहीं होता है। –

+0

अच्छा सवाल और बहुत अच्छा जवाब! मैंने सत्यापित किया कि हस्ताक्षरित प्रकार अपेक्षित उत्तर देगा। – lsk

+0

@ user1930928 धन्यवाद। :) –

3

आपने केवल फ़ील्ड के लिए 4 बिट आरक्षित किए हैं, साइन के लिए एक बिट का उपयोग किया जाता है, इसलिए केवल 3 बिट सकारात्मक मानों के लिए बने रहते हैं। इस प्रकार आप केवल 7 तक के मूल्यों को स्टोर कर सकते हैं।

+2

यू द्विआधारी प्रतिनिधित्व का उपयोग कर के बारे में समझाएं सकता है? –

+0

@RajaNarayan मेरा जवाब जांचें। –

+0

@SteveP। स्पष्टीकरण के लिए धन्यवाद! –

4

आपका फ़ील्ड 4 बिट हस्ताक्षरित पूर्णांक है। हस्ताक्षरित पूर्णांक के लिए ऊपरी बिट एक संकेत बिट है, जिसका अर्थ है कि आपके पास वास्तविक संख्या के लिए केवल 3 बिट हैं। फ़ील्ड में आप जिन नंबरों को स्टोर कर सकते हैं, उनकी संख्या -8 से 7 है (2 की प्रशंसा संग्रहण मानते हैं)।

9 के लिए बिट पैटर्न 1001 है, जिसमें चौथा बिट सेट है, जिसका अर्थ है कि इसे ऋणात्मक संख्या के रूप में व्याख्या किया जाता है, यही कारण है कि यह एक -7 के रूप में प्रिंट हो रहा है। यदि आप -1 की अपेक्षा करते हैं, तो आपको 2's compliment पर पढ़ने की आवश्यकता है।

आप क्षेत्र में 9 स्टोर करने के लिए सक्षम होने के लिए चाहते हैं के बाद से यह two's complement है, सर्वोच्च क्रम सा हस्ताक्षर के लिए प्रयोग किया जाता है, a एक unsigned int

2

आप अहस्ताक्षरित वास्तव में पूर्णांक उपयोग करने के लिए:

#include<stdio.h> 
struct a 
{ 
    unsigned a:4; // <-- unsigned indeed int, then work good 
}; 
main(){ 
struct a aa; 
aa.a=9; 
printf("a=%d\n",aa.a); 
return 0; 
} 

उत्पादन:

a=9 
संबंधित मुद्दे