मैं इस कोड के बारे में उत्सुक हूं:
cout << 'test'; // Note the single quotes.
मुझे का एक आउटपुट देता है 1952805748
।
मेरा प्रश्न: आउटपुट मेमोरी या कुछ और में एक पता है?
मैं इस कोड के बारे में उत्सुक हूं:
cout << 'test'; // Note the single quotes.
मुझे का एक आउटपुट देता है 1952805748
।
मेरा प्रश्न: आउटपुट मेमोरी या कुछ और में एक पता है?
जवाबों:
यह एक बहु-चरित्र शाब्दिक है। 1952805748
है 0x74657374
, जो के रूप में विघटित होता है
0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'
संपादित करें:
सी ++ मानक, ++2.14.3 / 1 - चरित्र शाब्दिक
(...) एक साधारण वर्ण शाब्दिक जिसमें एक से अधिक सी-चार होते हैं, एक मल्टीचैकर शाब्दिक है। एक मल्टीचैकर शाब्दिक प्रकार इंट और कार्यान्वयन-डे। नेड मूल्य है।
sizeof(int)
कार्यान्वयन को भी परिभाषित किया गया है। इसलिए न केवल भंडारण आदेश कार्यान्वयन को परिभाषित किया गया है, बल्कि इनमें से अधिकतम लंबाई भी है।
नहीं, यह कोई पता नहीं है। यह तथाकथित मल्टीबैट चरित्र है।
आमतौर पर, यह संयुक्त रूप से चार वर्णों का ASCII मान है।
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
तो 0x74657374 1952805748 है।
लेकिन यह किसी अन्य कंपाइलर पर 0x74736574 भी हो सकता है। C और C ++ मानकों दोनों का कहना है कि मल्टीबाइट वर्णों का मूल्य कार्यान्वयन है । इसलिए आम तौर पर इसका उपयोग दृढ़ता से हतोत्साहित किया जाता है।
int
अधिकांश मशीनों पर 4 बाइट्स हैं, मुझे नहीं लगता कि यह 4 बाइट्स से अधिक का उपयोग करने के लिए समझ में आता है। हां, कुछ स्थिरांक लिखने का यह एक सुविधाजनक तरीका था, लेकिन दुर्भाग्य से अलग-अलग संकलक इसे अलग तरह से व्याख्या कर रहे हैं, इसलिए आजकल अधिकांश कोडिंग शैली इसके उपयोग को हतोत्साहित करती हैं।
==
एक साधारण चरित्र शाब्दिक जिसमें एक से अधिक सी-चार होते हैं, एक मल्टीचैकर शाब्दिक होता है। एक मल्टीचैकर शाब्दिक प्रकार इंट और कार्यान्वयन-डे। नेड मूल्य है।
कार्यान्वयन द्वारा परिभाषित परिभाषित व्यवहार को लागू करने की आवश्यकता है। उदाहरण के लिए जीसीसी में आप इसे यहां पा सकते हैं
संकलक एक बार में एक बहु-चरित्र चरित्र को एक चरित्र को महत्व देता है, प्रति लक्षित चरित्र की बिट्स की संख्या द्वारा छोड़े गए पिछले मान को शिफ्ट कर रहा है, और फिर नए वर्ण के बिट-पैटर्न में लक्ष्य के चौड़ाई में काट दिया गया चरित्र। अंतिम बिट-पैटर्न को इंट इंट दिया गया है, और इसलिए इस पर हस्ताक्षर किए गए हैं, चाहे एकल वर्ण हस्ताक्षरित हैं या नहीं।
अधिक विवरण के लिए इस पृष्ठ में स्पष्टीकरण की जाँच करें
वे वास्तव में सिर्फ int
एस। वे कोर ऑडियो एपीआई एनम के उदाहरण के लिए, CoreAudioTypes.h
हेडर फ़ाइल में बड़े पैमाने पर उपयोग किए जाते हैं ,
enum
{
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
} ;
"प्लेटफ़ॉर्म स्वतंत्र" नहीं होने के बारे में बहुत सारी बकवास है, लेकिन जब आप एक एपीआई का उपयोग कर रहे हैं जो एक विशिष्ट प्लेटफ़ॉर्म के लिए बनाया गया है, जो पोर्टेबिलिटी के बारे में परवाह करता है। एक ही मंच पर समानता के लिए जाँच कभी विफल नहीं होगी। इन enum
मूल्यों को पढ़ना आसान है और वे वास्तव में अपने मूल्य में अपनी पहचान रखते हैं , जो बहुत अच्छा है।
नीचे मैंने जो करने की कोशिश की है वह एक मल्टीबाइट कैरेक्टर शाब्दिक है, इसलिए इसे प्रिंट किया जा सकता है (मैक पर यह काम करता है)। अजीब बात है, यदि आप सभी 4 वर्णों का उपयोग नहीं करते हैं, तो परिणाम नीचे गलत हो जाता है।
#include <stdio.h>
#define MASK(x,BYTEX) ((x&(0xff<<8*BYTEX))>>(8*BYTEX))
struct Multibyte
{
union{
int val ;
char vals[4];
};
Multibyte() : val(0) { }
Multibyte( int in )
{
vals[0] = MASK(in,3);
vals[1] = MASK(in,2);
vals[2] = MASK(in,1);
vals[3] = MASK(in,0);
}
char operator[]( int i ) {
return val >> (3-i)*8 ; // works on mac
//return val>>i*8 ; // might work on other systems
}
void println()
{
for( int i = 0 ; i < 4 ; i++ )
putc( vals[i], stdout ) ;
puts( "" ) ;
}
} ;
int main(int argc, const char * argv[])
{
Multibyte( 'abcd' ).println() ;
Multibyte( 'x097' ).println() ;
Multibyte( '\"\\\'\'' ).println() ;
Multibyte( '/*|' ).println() ;
Multibyte( 'd' ).println() ;
return 0;
}
इस तरह की सुविधा वास्तव में अच्छी है जब आप पार्सर का निर्माण कर रहे हैं। इस पर विचार करो:
byte* buffer = ...;
if(*(int*)buffer == 'GET ')
invoke_get_method(buffer+4);
यह कोड संभवतया केवल विशिष्ट एंडियन पर काम करेगा और विभिन्न कंपाइलरों को तोड़ सकता है