সি / সি ++ এ, কোনটি unsigned charব্যবহার করা হয়? এটি নিয়মিত থেকে কীভাবে আলাদা char?
সি / সি ++ এ, কোনটি unsigned charব্যবহার করা হয়? এটি নিয়মিত থেকে কীভাবে আলাদা char?
উত্তর:
সি ++ এ তিনটি স্বতন্ত্র চরিত্রের ধরণ রয়েছে:
charsigned charunsigned charআপনি যদি পাঠ্যের জন্য চরিত্রের ধরণগুলি ব্যবহার করেন তবে অযোগ্যকে ব্যবহার করুন char:
'a'বা '0'।"abcde"এটি একটি সংখ্যা মান হিসাবে কাজ করে, তবে সেই মানটি স্বাক্ষরিত বা স্বাক্ষরযুক্ত হিসাবে বিবেচিত হয় কিনা তা অনির্দিষ্ট। অসমতার মাধ্যমে চরিত্রের তুলনা থেকে সাবধান থাকুন - যদিও আপনি নিজেকে ASCII (0-127) এ সীমাবদ্ধ রাখেন তবে আপনি প্রায় নিরাপদ।
আপনি যদি সংখ্যা হিসাবে চরিত্রের ধরণগুলি ব্যবহার করেন তবে ব্যবহার করুন:
signed char, যা আপনাকে কমপক্ষে -127 থেকে 127 ব্যাপ্তি দেয়। (-128 থেকে 127 সাধারণ)unsigned char, যা আপনাকে কমপক্ষে 0 থেকে 255 ব্যাপ্তি দেয়।"কমপক্ষে", কারণ সি ++ স্ট্যান্ডার্ডটি প্রতিটি সংখ্যাসূচক প্রকারটি আবরণের জন্য প্রয়োজনীয় সর্বনিম্ন মানের সীমাবদ্ধতা দেয়। sizeof (char)1 (যেমন একটি বাইট) হওয়া প্রয়োজন, তবে তাত্ত্বিকভাবে একটি বাইট উদাহরণস্বরূপ 32 বিট হতে পারে। sizeofএখনও এর আকার হিসাবে এটি রিপোর্ট করা হবে1 - এর অর্থ যা আপনি থাকতে পারতেন sizeof (char) == sizeof (long) == 1।
sizeofকারণ এটি কোনও ফাংশন নয় বরং অপারেটর। কোনও ভেরিয়েবলের আকার নেওয়ার সময় প্রথম বন্ধনী বাদ দেওয়া আরও ভাল স্টাইল। sizeof *pবা sizeof (int)। এটি কোনও ধরণের বা ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য তা দ্রুত তা পরিষ্কার করে দেয়। তেমনি, পরে বন্ধনী স্থাপন করাও বাজে কথা return। এটি কোনও ফাংশন নয়।
char: এটি চরিত্রের আক্ষরিক ধরণের 'a'বা এর মতো type '0'" সি ++ তে সত্য তবে সি-তে নয়, 'a'এটি একটি int।
এটি বাস্তবায়ন নির্ভর, কারণ সি স্ট্যান্ডার্ড এর স্বাক্ষরিত নেস সংজ্ঞা দেয় না char। প্ল্যাটফর্মের উপর নির্ভর করে, গৃহস্থালির কাজ হতে পারে signedবা unsigned, তাই আপনি স্পষ্টভাবে জন্য জিজ্ঞাসা করতে হবে signed charবা unsigned charযদি আপনার বাস্তবায়ন উপর নির্ভর করে। শুধু ব্যবহারcharআপনি যদি স্ট্রিং থেকে অক্ষরগুলি উপস্থাপন করতে চান তবে , কারণ এটি আপনার প্ল্যাটফর্মটির স্ট্রিংয়ের সাথে কী মিলবে match
মধ্যে পার্থক্য signed charএবং unsigned charআপনি আশা করতেন হিসাবে হয়। সবচেয়ে প্ল্যাটফর্মে signed char8-বিট দুই এর সম্পূরক ছোটো থেকে সংখ্যা হতে হবে -128করার 127, এবং unsigned char(একটি 8-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যা হতে হবে 0করার 255)। নোট করুন স্ট্যান্ডার্ডের জন্য এই charধরণের 8 বিট থাকতে হবে না, কেবল সেই sizeof(char)রিটার্ন 1। আপনার সাথে একটি গৃহস্থালির কাজ বিট সংখ্যা পেতে পারেন CHAR_BITএ limits.h। আজ এমন কয়েকটি প্ল্যাটফর্ম রয়েছে যেখানে এটি ব্যতীত অন্য কিছু হবে 8।
এই সংখ্যার একটা চমৎকার সারাংশ এখানে ।
যেমনটি আমি পোস্ট করার পরে অন্যরা উল্লেখ করেছেন, আপনি ব্যবহার করা ভাল int8_tএবং uint8_tআপনি যদি সত্যিই ছোট পূর্ণসংখ্যা উপস্থাপন করতে চান তবে।
CHAR_BITমান দ্বারা কমপক্ষে 8 বিট হওয়া প্রয়োজন।
যেহেতু আমি মনে করি এটি সত্যই জন্য আহ্বান করা হয়েছে, আমি কেবল সি এবং সি ++ এর কিছু নিয়ম বলতে চাই (তারা এ ক্ষেত্রে একই রকম)। প্রথমত, সমস্ত বিট এর unsigned charমান যদি থাকে স্বাক্ষরবিহীন গৃহস্থালির কাজ বস্তুর নির্ধারণে অংশগ্রহণ। দ্বিতীয়ত, unsigned charস্বাক্ষরবিহীনভাবে স্পষ্টভাবে বলা আছে।
এখন, আমি এরকম কি যখন আপনি মান রূপান্তর সম্পর্কে কারও সাথে আলোচনা করতে লাগলেন -1করার int- এ টাইপ unsigned char। তিনি এই ধারণাটি প্রত্যাখ্যান করেছিলেন যে ফলস্বরূপ unsigned charতার সমস্ত বিট 1 তে সেট করা আছে, কারণ তিনি সাইন প্রতিনিধিত্ব সম্পর্কে উদ্বিগ্ন ছিলেন। তবে তার দরকার নেই। এই নিয়মের সাথে সাথেই এটি অনুসরণ করা হচ্ছে যে রূপান্তরটি যা উদ্দেশ্য করে তা করে:
যদি নতুন প্রকারটি স্বাক্ষরবিহীন থাকে, মানটি নতুন ধরণের সীমার মধ্যে না আসা পর্যন্ত নতুন ধরণের প্রতিনিধিত্বযোগ্য সর্বাধিক মানের চেয়ে আরও একবার যোগ বা বিয়োগ করে মানটিকে রূপান্তর করা হয়। (
6.3.1.3p2একটি C99 খসড়া)
এটি গাণিতিক বিবরণ। সি ++ একে মডুলো ক্যালকুলাসের ক্ষেত্রে বর্ণনা করে যা একই নিয়মে ফল দেয়। যাইহোক, গ্যারান্টিযুক্ত যা নয় তা হ'ল -1রূপান্তরটির আগে পূর্ণসংখ্যার সমস্ত বিট এক হয়। সুতরাং, আমাদের কী আছে তাই আমরা দাবি করতে পারি যে ফলস্বরূপ unsigned charতার সমস্ত CHAR_BITবিট 1 হয়ে গেছে?
UCHAR_MAX+1করা -1হলে পরিসীমাটির মান হবেUCHAR_MAXআসলেই যথেষ্ট! সুতরাং যখনই আপনি unsigned charতার সমস্ত বিট এক পেতে চান, আপনি করেন
unsigned char c = (unsigned char)-1;
এটিও অনুসরণ করে যে কোনও রূপান্তর কেবল উচ্চতর অর্ডার বিটকে কাটা হয় না । দুজনের পরিপূরক জন্য ভাগ্যবান ইভেন্টটি হ'ল এটি কেবল একটি ছাঁটাই, তবে অন্যান্য চিহ্নের উপস্থাপনের ক্ষেত্রে এটি একইভাবে সত্য নয়।
UCHAR_MAXকরবেন না কেন ?
(unsigned type)-1একরকম প্রজ্ঞাময়। ~0নয়।
int x = 1234এবং char *y = &x। বাইনারি উপস্থাপনা 1234 হয় 00000000 00000000 00000100 11010010। আমার মেশিনটি সামান্য এডিয়ান তাই এটি এর বিপরীত হয় এবং 11010010 00000100 00000000 00000000মেমরিে সঞ্চয় করে এলএসবি প্রথমে আসে। এখন মূল অংশ। যদি আমি ব্যবহার printf("%d" , *p)। printfপ্রথম বাইট পড়বে 11010010কেবল আউটপুট -46তবে 11010010এটি 210কেন এটি মুদ্রণ করে -46। আমি সত্যই বিভ্রান্ত হয়ে পড়েছি অনুমান করি যে পূর্ণসংখ্যা প্রচারের জন্য কিছু চর কিছু করছে তবে আমি জানি না।
উদাহরণ স্বরূপ স্বাক্ষরিত চরের ব্যবহারগুলি :
unsigned charকম্পিউটার গ্রাফিক্সে প্রায়শই ব্যবহৃত হয়, যা প্রায়শই (যদিও সর্বদা নয়) প্রতিটি রঙের উপাদানকে একটি একক বাইট সরবরাহ করে। এটি একটি আরজিবি (বা আরজিবিএ) রঙটি 24 (বা 32) বিট হিসাবে উপস্থাপন করা প্রত্যক্ষভাবে দেখা যায়, প্রতিটি একটি unsigned char। যেহেতু unsigned charমানগুলি [0,255] এর মধ্যে আসে, তাই মানগুলি সাধারণত হিসাবে ব্যাখ্যা করা হয়:
সুতরাং আপনার আরজিবি লাল (255,0,0) -> (100% লাল, 0% সবুজ, 0% নীল) হিসাবে শেষ হবে।
কেন ব্যবহার করবেন না signed char? পাটিগণিত এবং বিট শিফটিং সমস্যাযুক্ত হয়ে ওঠে। ইতিমধ্যে signed charবর্ণিত হিসাবে, একটির পরিসীমা মূলত -128 দ্বারা স্থানান্তরিত হয়। আরজিবিকে গ্রেস্কেলে রূপান্তরিত করার জন্য একটি খুব সহজ এবং নিষ্পাপ (বেশিরভাগ অব্যবহৃত) পদ্ধতিটি হল তিনটি রঙের উপাদানকে গড়ে গড়ে তোলা, তবে রঙের উপাদানগুলির মানগুলি নেতিবাচক হলে এটি সমস্যার মধ্যে চলে। unsigned charগাণিতিক ব্যবহার করার সময় লাল (255, 0, 0) গড়ে গড়ে (85, 85, 85) । তবে মানগুলি যদি signed char(127, -128, -128) হয় তবে আমরা (-99, -99, -99) দিয়ে শেষ করব যা আমাদের unsigned charস্পেসে (29, 29, 29) হবে , যা ভুল ।
আপনি যদি একটি ছোট ছোট পূর্ণসংখ্যা হিসাবে একটি অক্ষর ব্যবহার করতে চান, তবে এটির সবচেয়ে নিরাপদ উপায়টি int8_tএবং uint8_tপ্রকারগুলি সহ।
int8_tএবং uint8_toptionচ্ছিক এবং আর্কিটেকচারে সংজ্ঞায়িত নয় যেখানে বাইটের আকারটি 8 বিট নয় exactly বিপরীতে, signed charএবং unsigned charসর্বদা উপলব্ধ এবং কমপক্ষে 8 বিট ধরে রাখার গ্যারান্টিযুক্ত। এটি একটি সাধারণ উপায় হতে পারে তবে নিরাপদ নয় ।
signed charএবং unsigned char? অথবা আপনি কি সেই বিশেষ ক্ষেত্রে আরও ভাল "নিরাপদ" বিকল্পের পরামর্শ দিতে চান? উদাহরণস্বরূপ "বাস্তব" পূর্ণসংখ্যার প্রকারের সাথে আঁকতে signed intএবং unsigned intপরিবর্তে কোনও কারণে?
signed charএবং unsigned charসমস্ত কার্যকর প্রয়োগকারীর জন্য বহনযোগ্য এবং স্টোরেজ স্পেস সংরক্ষণ করবে তবে কিছু কোডের আকার বাড়তে পারে। কিছু ক্ষেত্রে, বিটফিল্ডে বা নিয়মিত পূর্ণসংখ্যার একক বিটগুলিতে ছোট মান সংরক্ষণ করে কেউ বেশি স্টোরেজ স্থান বাঁচাতে পারে। এই প্রশ্নের কোনও নিখুঁত উত্তর নেই, এই পদ্ধতির সুক্ষ্মতাটি নির্দিষ্ট হাতের ক্ষেত্রে নির্ভর করে। এবং এই উত্তরটি যাইহোক প্রশ্নের সমাধান করে না।
charএবং unsigned charসমস্ত প্ল্যাটফর্মগুলিতে 8-বিট ধরণের হওয়ার গ্যারান্টি নেই - এগুলি 8-বিট বা বড় হওয়ার গ্যারান্টিযুক্ত। কিছু প্ল্যাটফর্মে 9-বিট, 32-বিট, বা 64-বিট বাইট থাকে । তবে, বর্তমানে সর্বাধিক প্রচলিত প্ল্যাটফর্মগুলিতে (উইন্ডোজ, ম্যাক, লিনাক্স x86, ইত্যাদি) 8-বিট বাইট রয়েছে।
signed charএর পরিধি -128 থেকে 127; unsigned charপরিসীমা 0 থেকে 255 পর্যন্ত রয়েছে।
char সংকলকটির উপর নির্ভর করে স্বাক্ষর করা চর বা স্বাক্ষরবিহীন চরের সমতুল্য হবে তবে এটি একটি স্বতন্ত্র প্রকার।
আপনি যদি সি-স্টাইলের স্ট্রিং ব্যবহার করছেন তবে কেবল ব্যবহার করুন char। আপনার যদি পাটিগণিতের জন্য চরগুলি ব্যবহার করার প্রয়োজন হয় (খুব বিরল), স্বাক্ষরযুক্ত বা স্বাক্ষরযুক্ত স্বতন্ত্রভাবে বহনযোগ্যতার জন্য নির্দিষ্ট করুন।
একটি unsigned charহ'ল স্বাক্ষরযুক্ত বাইট মান (0 থেকে 255)। আপনি charএকটি "চরিত্র" হিসাবে বিবেচনা করতে পারেন তবে এটি সত্যই একটি সংখ্যার মান। নিয়মিত charস্বাক্ষরিত হয়, সুতরাং আপনার 128 টি মান রয়েছে এবং এই মানগুলি ASCII এনকোডিং ব্যবহার করে অক্ষরগুলিতে মানচিত্র করে। তবে উভয় ক্ষেত্রেই, আপনি মেমরিতে যা সঞ্চয় করছেন তা বাইট মান।
প্রত্যক্ষ মানগুলির ক্ষেত্রে নিয়মিত চর ব্যবহার করা হয় যখন মানগুলির মধ্যে হয় CHAR_MINএবং CHAR_MAXযখন স্বাক্ষরবিহীন গৃহস্থালিটি ইতিবাচক প্রান্তে দ্বিগুণ পরিসীমা সরবরাহ করে। উদাহরণস্বরূপ, যদি CHAR_BIT8 charহয় তবে নিয়মিত সীমাটি কেবলমাত্র [0, 127] হওয়ার নিশ্চয়তা দেয় (কারণ এটি স্বাক্ষরিত বা স্বাক্ষরিত unsigned charহতে পারে ) যখন হবে [0, 255] এবংsigned char হবে [-127, 127] হবে।
এটি কীসের জন্য ব্যবহার করা হয় তার পদগুলিতে, মানগুলি পিওডের বস্তুগুলিকে (সাধারণ পুরানো ডেটা) সরাসরি স্বাক্ষরবিহীন চরের অ্যারে রূপান্তরিত করতে দেয়। এটি আপনাকে অবজেক্টের উপস্থাপনা এবং বিট নিদর্শনগুলি পরীক্ষা করতে দেয়। নিরাপদ প্রকার শাস্তির একই গ্যারান্টি চর বা স্বাক্ষরিত চরের জন্য বিদ্যমান নেই।
unsigned charএকটি না অ্যারের বিশেষভাবে, & যে কোনো "রূপান্তর" শুধুমাত্র আনুষ্ঠানিকভাবে দ্বারা সংজ্ঞায়িত করা হয় অনুলিপি একটি বাস্তব করতে বস্তু থেকে ঘোষণা অ্যারে এর unsigned char& তারপর আধুনিক পরিদর্শন। এটি স্পষ্ট নয় যে ওআরকে সরাসরি অ্যারে হিসাবে পুনরায় ব্যাখ্যা করা যেতে পারে, পয়েন্টার পাটিগণিতের জন্য ভাতার সাথে এটি অন্তর্ভুক্ত হবে, অর্থাত ==এই ব্যবহারে "সিক্যুয়েন্স" "অ্যারে" কিনা । এটি পরিষ্কার হওয়ার আশায় একটি কোর ইস্যু # 1701 খোলা আছে। ধন্যবাদ, যেহেতু এই অস্পষ্টতা সত্যিই আমাকে সম্প্রতি বাড়িয়ে তুলছে।
unsigned charOR এর 1 ম পয়েন্টারটি নিয়ে যেতে পারি এবং তারপরে ++ptrএটির প্রতিটি বাইট পড়তে ব্যবহার করতে এগিয়ে যাই ... তবে আফিক্স, এটি নির্দিষ্টভাবে অনুমোদিত হওয়ার হিসাবে সংজ্ঞায়িত হয়নি, তাই আমরা একটি জিগস ধাঁধা সদৃশ স্ট্যান্ডার্ডে প্রচুর অন্যান্য প্যাসেজগুলি (এবং বিভিন্ন উপায়ে কেবলমাত্র অস্তিত্ব ) থেকে এটি সম্ভবত 'ঠিক আছে' বলে বামে ফেলেছে memcpy। যা আদর্শ নয়। ঠিক আছে, সম্ভবত শব্দটির অবশেষে উন্নতি হবে। এখানে আমি সিডাব্লুজি
unsigned charসমস্ত বিট কৌতুক হৃদয় হয়। সমস্ত প্ল্যাটফর্মের জন্য প্রায় সমস্ত সংকলক একটি unsigned charসহজ একটি বাইট এবং (সাধারণত) 8 বিটের স্বাক্ষরবিহীন পূর্ণসংখ্যা যা একটি ছোট পূর্ণসংখ্যা বা বিটের একটি প্যাক হিসাবে বিবেচনা করা যেতে পারে।
আসক্তিতে, অন্য কেউ যেমন বলেছে, মান কোনও চরের চিহ্নটি সংজ্ঞায়িত করে না। তাই আপনি 3 স্বতন্ত্র আছে charপ্রকারসমূহ: char, signed char, unsigned char।
আপনি নির্দিষ্ট দৈর্ঘ্য এবং signedness বিভিন্ন ধরনের ব্যবহার করার মত, আপনি সম্ভবত সাথে উন্নত বন্ধ হন, তাহলে uint8_t, int8_t, uint16_t, ইত্যাদি কারণ তারা তারা ঠিক কি বলে।
কিছু পাওয়া Googling এই , যেখানে লোকেরা এ ব্যাপারে আলোচনা করতে লাগলেন।
স্বাক্ষরবিহীন চরটি মূলত একক বাইট। সুতরাং, আপনার যদি কোনও বাইট ডেটা প্রয়োজন হয় তবে আপনি এটি ব্যবহার করবেন (উদাহরণস্বরূপ, সম্ভবত আপনি এটি কোনও ফাংশনে পাস করার জন্য পতাকাগুলি চালু এবং বন্ধ রাখতে ব্যবহার করতে চান, যেমনটি উইন্ডোজ এপিআই-তে প্রায়ই করা হয়)।
একটি স্বাক্ষরবিহীন চরটি বিটটি ব্যবহার করে যা অন্য সংখ্যা হিসাবে নিয়মিত চরের স্বাক্ষরের জন্য সংরক্ষিত থাকে। এটি [-128 - 127] এর বিপরীতে [0 - 255] এ ব্যাপ্তি পরিবর্তন করে।
সাধারণত আপনি স্বাক্ষর না চাইলে স্বাক্ষরযুক্ত অক্ষর ব্যবহার করা হয়। স্থান পরিবর্তনকারী বিটগুলি (শিফটটি সাইন বাড়িয়ে তোলে) এবং অন্যান্য বিষয়গুলি যখন সংখ্যা হিসাবে ব্যবহার না করে একটি বাইট হিসাবে ব্যবহার করার সময় অন্যান্য জিনিসগুলি করার সময় এটি একটি তাত্পর্য তৈরি করবে।
"সি প্রোগ্রামিং লাগেজ" বইয়ের উদ্ধৃতি
কোয়ালিফায়ার signedবা unsignedচর বা যে কোনও পূর্ণসংখ্যার জন্য প্রয়োগ করা যেতে পারে। স্বাক্ষরবিহীন সংখ্যাগুলি সর্বদা ধনাত্মক বা শূন্য থাকে এবং গাণিতিক মডুলো 2 ^ n এর আইন মেনে চলে, যেখানে এন টাইপের বিটের সংখ্যা। সুতরাং, উদাহরণস্বরূপ, যদি অক্ষরগুলি 8 বিট হয়, স্বাক্ষরযুক্ত চরগুলি 0 এবং 255 এর মধ্যে থাকে তবে স্বাক্ষর করা অক্ষরের মান -128 এবং 127 এর মধ্যে থাকে (দু'জনের পরিপূরক মেশিনে plain) সরল অক্ষর স্বাক্ষরিত বা স্বাক্ষরবিহীন মেশিন কিনা নির্ভরশীল, তবে মুদ্রণযোগ্য অক্ষরগুলি সর্বদা ইতিবাচক থাকে।
signed charএবং unsigned charউভয়ই 1 বাইট উপস্থাপন করে তবে তাদের আলাদা আলাদা রেঞ্জ রয়েছে।
Type | range
-------------------------------
signed char | -128 to +127
unsigned char | 0 to 255
ইন signed charযদি আমরা বিবেচনা char letter = 'A', 'এ' 65 এর বাইনারি প্রতিনিধিত্ব করি ASCII/Unicode, তাহলে 65 সংরক্ষণ করা যেতে পারে, -65 এছাড়াও সংরক্ষণ করা যেতে পারে। ASCII/Unicodeনেতিবাচক মান সম্পর্কে চিন্তা করার প্রয়োজন নেই সেখানে কোনও নেতিবাচক বাইনারি মান নেই।
উদাহরণ
#include <stdio.h>
int main()
{
signed char char1 = 255;
signed char char2 = -128;
unsigned char char3 = 255;
unsigned char char4 = -128;
printf("Signed char(255) : %d\n",char1);
printf("Unsigned char(255) : %d\n",char3);
printf("\nSigned char(-128) : %d\n",char2);
printf("Unsigned char(-128) : %d\n",char4);
return 0;
}
আউটপুট -:
Signed char(255) : -1
Unsigned char(255) : 255
Signed char(-128) : -128
Unsigned char(-128) : 128