আমি এই কোড সম্পর্কে উত্সাহী:
cout << 'test'; // Note the single quotes.
আমাকে একটি আউটপুট দেয় 1952805748
।
আমার প্রশ্ন: আউটপুট মেমরির ঠিকানা বা কিছু?
আমি এই কোড সম্পর্কে উত্সাহী:
cout << 'test'; // Note the single quotes.
আমাকে একটি আউটপুট দেয় 1952805748
।
আমার প্রশ্ন: আউটপুট মেমরির ঠিকানা বা কিছু?
উত্তর:
এটি একটি বহু-চরিত্রের আক্ষরিক। 1952805748
হ'ল 0x74657374
, যা হিসাবে পচে যায়
0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'
সম্পাদনা:
সি ++ স্ট্যান্ডার্ড, .12.14.3 / 1 - অক্ষর আক্ষরিক
(...) একটি সাধারণ চরিত্রের আক্ষরিক যা একাধিক সি-চর ধারণ করে এটি একটি মাল্টিচ্যারেক্টর আক্ষরিক। একটি মাল্টিচার্যাক্টর আক্ষরিকের টাইপ ইন্ট এবং প্রয়োগকরণ-ডি-নেড হয় has
sizeof(int)
হ'ল বাস্তবায়নও সংজ্ঞায়িত। সুতরাং কেবল স্টোরেজ অর্ডার বাস্তবায়নই সংজ্ঞায়িত করা হয় না, তবে এর সর্বোচ্চ দৈর্ঘ্যটিও।
না, এটি কোনও ঠিকানা নয়। এটি তথাকথিত মাল্টিবাইট চরিত্র।
সাধারণত, এটি সংযুক্ত চারটি অক্ষরের ASCII মান।
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
সুতরাং 0x74657374 1952805748 হয়।
তবে এটি অন্য কয়েকটি সংকলকটিতে 0x74736574ও হতে পারে। সি এবং সি ++ স্ট্যান্ডার্ড উভয়ই বলে যে মাল্টিবাইট অক্ষরের মান বাস্তবায়ন সংজ্ঞায়িত । সুতরাং সাধারণত এর ব্যবহার দৃ strongly ়ভাবে নিরুৎসাহিত করা হয়।
int
বেশিরভাগ মেশিনে 4 বাইট হয়, তাই 4 বাইটের বেশি ব্যবহার করা বোধগম্য বলে আমি মনে করি না। হ্যাঁ, এটি কিছু ধ্রুবক লেখার সুবিধাজনক উপায় হওয়ার উদ্দেশ্য ছিল, তবে দুর্ভাগ্যক্রমে বিভিন্ন সংকলকগুলি এটির ভিন্ন ব্যাখ্যা করে চলেছে, তাই আজকাল বেশিরভাগ কোডিং শৈলীগুলি এর ব্যবহারকে নিরুৎসাহিত করে।
==
একটি সাধারণ চরিত্রের আক্ষরিক যা একাধিক সি-চর ধারণ করে তা হ'ল বহুচরাক্ষর আক্ষরিক। একটি মাল্টিচার্যাক্টর আক্ষরিকের টাইপ ইন্ট এবং প্রয়োগকরণ-ডি-নেড হয় has
বাস্তবায়ন সংজ্ঞায়িত আচরণ বাস্তবায়নের মাধ্যমে নথিভুক্ত করা প্রয়োজন। উদাহরণস্বরূপ জিসিসিতে আপনি এটি এখানে খুঁজে পেতে পারেন
সংকলকটি একবারে বহু অক্ষরযুক্ত অক্ষরকে একটি অক্ষরকে স্থির করে, টার্গেটের অক্ষর অনুসারে বিটের সংখ্যার দ্বারা পূর্বের মানটি স্থানান্তর করে এবং তারপরে অথবা নতুন অক্ষরের বিট-প্যাটার্নে লক্ষ্যের প্রস্থে ছিন্ন হয়ে থাকে অক্ষর। চূড়ান্ত বিট-প্যাটার্নটি টাইপ ইন্টি দেওয়া হয় এবং একক অক্ষর স্বাক্ষরিত হয় বা না তা বিবেচনা না করে স্বাক্ষরিত হয়।
আরও তথ্যের জন্য এই পৃষ্ঠায় ব্যাখ্যা চেক করুন
তারা সত্যিই ঠিক 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);
এই কোডটি সম্ভবত নির্দিষ্ট নির্দিষ্টতা নিয়ে কাজ করবে এবং বিভিন্ন সংকলক জুড়ে ভেঙে যেতে পারে