क्या डिफ़ॉल्ट रूप से हस्ताक्षरित या अहस्ताक्षरित है?


158

"सी का पूरा संदर्भ" पुस्तक में यह उल्लेख किया गया है कि charडिफ़ॉल्ट अहस्ताक्षरित है।

लेकिन मैं इसे जीसीसी के साथ-साथ विजुअल स्टूडियो के साथ सत्यापित करने की कोशिश कर रहा हूं। यह डिफ़ॉल्ट रूप से हस्ताक्षरित के रूप में ले रहा है ।

कौनसा सही है?


5
वन सी रेफरेंस बुक I ट्रस्ट, हैरिसन एंड स्टील की "सी: ए रेफरेंस मैनुअल" ( careferencemanual.com )। बेशक मानक अंतिम शब्द है, लेकिन यह बहुत पठनीय नहीं है और केवल पूर्व-मानक और आम (यानी।, POSIX) पर थोड़ी जानकारी देता है जो मानक के बाहर हैं। हार्बिसन और स्टील काफी पठनीय, विस्तृत और संभवतः अधिकांश संदर्भों की तुलना में अधिक सही है। हालाँकि, यह एक ट्यूटोरियल भी नहीं है, इसलिए यदि आप सीखने के प्रारंभिक चरण में हैं तो शायद इसमें कूदना कोई बड़ी बात नहीं है।
माइकल बूर

15
मुझे लगता है कि आप जो किताब पढ़ रहे हैं वह सी: द कम्प्लीट रेफरेंस है , हर्बर्ट शिल्ड्ट द्वारा। इस पुस्तक की समीक्षा ( accu.informika.ru/accu/bookreviews/public/reviews/c/c002173.htm ) से: मैं इस पुस्तक की अनुशंसा नहीं करने जा रहा हूं (आप में से बहुत से लोग मेरे विचारों को बहुत अधिक भार देते हैं) लेकिन मुझे नहीं लगता कि यह वही ऑप्रॉप्रियम है जो वैध रूप से अपने किसी अन्य काम में फेंक दिया गया है। जैसा कि माइकल कहते हैं, बहुत बेहतर संदर्भ है हार्बिसन और स्टील
आलोक सिंघल

यहाँ मेरे दो सेंट: क्योंकि charअहस्ताक्षरित किया जा सकता है, अंगूठे के एक नियम के रूप में उपयोग intकरने के लिए एक मान पढ़ने के लिए getchar(), जो वापस आ सकता है EOFEOFको आमतौर पर -1या अन्य नकारात्मक मान के रूप में परिभाषित किया जाता है , जो unsignedकि आप जो चाहते हैं, वह नहीं है। यहां घोषणा है: extern int getchar();बीटीडब्ल्यू, यह सिफारिश "सी: ए संदर्भ मैनुअल" पुस्तक से भी आती है।
मैक्सिम चेत्रुस्का

6
एक सी संदर्भ मुझे भरोसा है आईएसओ / IEC 9899: 2011 :-)
जेफ

3
@MaxChetrusca अच्छी सलाह लेकिन खराब तर्क: हस्ताक्षरित charमामले पर भी , आपको intरिटर्न वैल्यू स्टोर करने के लिए उपयोग करना होगा ।
अंती हापाला

जवाबों:


204

किताब गलत है। यदि मानक charपर हस्ताक्षर किए गए या अहस्ताक्षरित हैं, तो मानक निर्दिष्ट नहीं करता है।

वास्तव में, मानक तीन अलग प्रकार परिभाषित करता है: char, signed char, और unsigned char। अगर तुम#include <limits.h> और फिर देखते हैं CHAR_MIN, तो आप पता लगा सकते हैं कि क्या सादा charहै signedया unsigned(यदि CHAR_MIN0 से कम है या 0 के बराबर है), लेकिन फिर भी, तीन प्रकार अलग-अलग हैं जहाँ तक मानक का संबंध है।

ध्यान दें कि charइस तरह से विशेष है। यदि आप एक चर के रूप में घोषित करते हैंint को घोषित करते हैं तो इसे घोषित करने के बराबर 100% है signed int। यह सभी कंपाइलर और आर्किटेक्चर के लिए हमेशा सही होता है।


1
@ आलोक: वही कुछ अन्य डेटाटाइप्स के लिए सही नहीं है, उदाहरण के लिए हमेशा intमतलब है signed int, है ना? इसके अलावा char, अन्य डेटाटाइप्स में क्या समान भ्रम है C?
लेज़र

8
@eSKay: हां, charएकमात्र प्रकार है जिस पर हस्ताक्षर किए जा सकते हैं या बिना हस्ताक्षर किए। उदाहरण के लिए intबराबर है signed int
आलोक सिंघल

28
इसके लिए एक हिस्टेरिकल, एर, ऐतिहासिक कारण है - सी के जीवन में शुरुआती "मानक" कम से कम दो बार फ्लिप-फ्लॉप हुआ था, और कुछ लोकप्रिय शुरुआती कंपाइलरों ने एक तरह से समाप्त कर दिया और दूसरे ने दूसरे को।
हॉट लिक्स

9
@AlokSinghal: यह भी कार्यान्वित-परिभाषित है कि प्रकार intका एक बिट क्षेत्र हस्ताक्षरित है या अहस्ताक्षरित है।
कीथ थॉम्पसन

@KeithThompson सुधार के लिए धन्यवाद। मैं बिट क्षेत्र प्रकारों के बारे में कुछ विवरण भूल जाता हूं क्योंकि मैं उनका उपयोग नहीं करता हूं।
आलोक सिंघल

67

जैसा कि आलोक बताते हैं , मानक लागू होने तक छोड़ देता है।

जीसीसी के लिए, डिफ़ॉल्ट पर हस्ताक्षर किए जाते हैं, लेकिन आप इसे संशोधित कर सकते हैं -funsigned-charनोट: Android NDK में gcc के लिए, डिफ़ॉल्ट अहस्ताक्षरित है । आप हस्ताक्षरित वर्णों के साथ स्पष्ट रूप से पूछ सकते हैं -fsigned-char

MSVC पर, डिफ़ॉल्ट पर हस्ताक्षर किए गए हैं लेकिन आप इसे संशोधित कर सकते हैं /J


2
दिलचस्प है कि शिल्ड्ट का विवरण एमएसवीसी के व्यवहार से मेल नहीं खाता है क्योंकि उनकी किताबें आमतौर पर एमएसवीसी उपयोगकर्ताओं की ओर देखी जाती हैं। मुझे आश्चर्य है कि अगर एमएस ने किसी बिंदु पर डिफ़ॉल्ट को बदल दिया?
माइकल बूर

1
मैंने सोचा कि यह संकलक पर निर्भर नहीं था, लेकिन मंच पर। मुझे लगा कि चार प्रकार के "वर्ण डेटाटाइप" के रूप में चार को छोड़ दिया गया था, जो कि उस समय के सिस्टम के अनुरूप था, जो मुद्रण योग्य पात्रों के रूप में उपयोग किया जाता था।
स्पाइडी

10
GCC डॉक्स का कहना है कि यह मशीन-निर्भर है: " प्रत्येक प्रकार की मशीन में चार के लिए डिफ़ॉल्ट होना चाहिए। यह या तो डिफ़ॉल्ट रूप से अहस्ताक्षरित चार की तरह है या डिफ़ॉल्ट रूप से हस्ताक्षरित चार की तरह है। "
Deduplicator

1
क्या आप कृपया अपने नोट के लिए एक स्रोत प्रदान कर सकते हैं कि Android पर डिफ़ॉल्ट अहस्ताक्षरित चार है?
phlipsy

1
@ स्‍पायडी सी मानक कंपाइलर, प्‍लेटफार्म और सीपीयू आर्किटेक्चर के बीच कोई वास्तविक अंतर नहीं करता है। यह सिर्फ "कार्यान्वयन" के तहत उन सभी को एक साथ देता है।
प्लग

35

C99 N1256 ड्राफ्ट 6.2.5 / 15 "प्रकार" में इस प्रकार के हस्ताक्षरित-नेस के बारे में कहना है char:

कार्यान्वयन समान सीमा, प्रतिनिधित्व, और व्यवहार के लिए या तो हस्ताक्षरित चार या अहस्ताक्षरित चार के रूप में परिभाषित करेगा।

और एक फुटनोट में:

CHAR_MIN, परिभाषित <limits.h>, में एक मान होगा 0या SCHAR_MIN, और इसका उपयोग दो विकल्पों में अंतर करने के लिए किया जा सकता है। पसंद की परवाह किए बिना, charअन्य दो से एक अलग प्रकार है और दोनों के साथ संगत नहीं है।


7

डेनिस रिची द्वारा द सी प्रोग्रामिंग लैंग्वेज की पुस्तक के अनुसार जो एएनएसआई सी के लिए डी-फैक्टो मानक पुस्तक है, सादे हस्ताक्षर या तो हस्ताक्षर किए गए या अहस्ताक्षरित मशीन पर निर्भर हैं, लेकिन प्रिंट करने योग्य वर्ण हमेशा सकारात्मक होते हैं।


9
यह जरूरी नहीं है कि प्रिंट करने योग्य चरित्र हमेशा सकारात्मक हों। C मानक गारंटी देता है कि मूल निष्पादन वर्ण सेट के सभी सदस्यों में गैर-नकारात्मक मान हैं।
कीथ थॉम्पसन

7

सी मानक के अनुसार सादे चार की हस्ताक्षर "कार्यान्वयन परिभाषित" है।

सामान्य तौर पर कार्यान्वयनकर्ताओं ने अपनी वास्तुकला पर लागू करने के लिए जो भी अधिक कुशल चुना था। आमतौर पर x86 सिस्टम चार पर हस्ताक्षर किए जाते हैं। आर्म सिस्टम पर यह आम तौर पर अहस्ताक्षरित है (Apple iOS एक अपवाद है)।



2
@plugwash आपका उत्तर शायद अस्वीकृत हो गया क्योंकि टिम पोस्ट ने अपनी चाबी खो दी । गंभीरता से, हालांकि, आपको किसी एकल डाउनवोट के बारे में चिंता नहीं करनी चाहिए जब तक कि आप सुनिश्चित हैं कि आपका उत्तर सही है (जो कि इस मामले में है)। बिना किसी वैध कारण के मेरे पदों को कम करने के लिए यह मेरे साथ कई बार हुआ है। इसके बारे में चिंता न करें, कभी-कभी लोग सिर्फ अजीब चीजें करते हैं।
डोनाल्ड डक

1
क्यों x86 पर हस्ताक्षरित चर अधिक कुशल है? कोई स्रोत?
मार्टिंक्यूनेव

2

ब्रेज़न स्ट्रॉस्ट्रुप द्वारा "द सी ++ प्रोग्रामिंग लैंग्वेज" के अनुसार, char"कार्यान्वयन परिभाषित" है। यह कार्यान्वयन पर signed charया unsigned charउसके आधार पर हो सकता है । आप जांच कर सकते हैं कि charहस्ताक्षर किए गए हैं या नहीं std::numeric_limits<char>::is_signed


9
यह एक C प्रश्न है। C ++ एक अलग भाषा है, और C ++ संदर्भों की C.
MM

1

अब, हम मानक पत्तियों को जानते हैं जो कार्यान्वयन तक हैं।

लेकिन यह कैसे जाँच करने के लिए एक प्रकार है signedया unsignedजैसे char?

मैंने ऐसा करने के लिए एक मैक्रो लिखा:

#define IS_UNSIGNED(t) ((t)~1 > 0)

और साथ यह परीक्षण gcc, clangऔर cl। लेकिन मुझे यकीन नहीं है कि यह हमेशा अन्य मामलों के लिए सुरक्षित है।


सामान्य CHAR_MIN <0 (या WCHAR_MIN <0 wchar_t के लिए) क्या गलत है?
Öö तिएब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.