স্বাক্ষরবিহীন চর কী?


উত্তর:


547

সি ++ এ তিনটি স্বতন্ত্র চরিত্রের ধরণ রয়েছে:

  • char
  • signed char
  • unsigned 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


4
স্পষ্টতই, আপনি কি 32-বিট চর এবং 32-বিট পূর্ণসংখ্যার, এবং আকারের (int)! = আকারের (চর) রাখতে পারবেন? আমি জানি যে স্ট্যান্ডার্ডটি সাইজফুল (চার্ট) == 1 বলছে, তবে আকারের প্রকৃত পার্থক্য বা ব্যাপ্তির পার্থক্যের উপর ভিত্তি করে কি আপেক্ষিক আকার (ইনট) হবে?
জোসেফ গারভিন

14
+1 টি। তবে সি ++ এ চারটি স্বতন্ত্র চরিত্রের প্রকার রয়েছে, wchar_t এর মধ্যে একটি।
এরিক জেড

11
সি ++ ১১ যেহেতু আপনার 6 টি স্বতন্ত্র প্রকার রয়েছে: চর, স্বাক্ষরযুক্ত চর, স্বাক্ষরবিহীন চর, wchar_t, char16_t, char32_t।
মার্চিনজ

12
@ ইউনিলিগ পরে কোনও স্থান স্থাপন করা সাধারণ sizeofকারণ এটি কোনও ফাংশন নয় বরং অপারেটর। কোনও ভেরিয়েবলের আকার নেওয়ার সময় প্রথম বন্ধনী বাদ দেওয়া আরও ভাল স্টাইল। sizeof *pবা sizeof (int)। এটি কোনও ধরণের বা ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য তা দ্রুত তা পরিষ্কার করে দেয়। তেমনি, পরে বন্ধনী স্থাপন করাও বাজে কথা return। এটি কোনও ফাংশন নয়।
প্যাট্রিক Schlüter

3
" char: এটি চরিত্রের আক্ষরিক ধরণের 'a'বা এর মতো type '0'" সি ++ তে সত্য তবে সি-তে নয়, 'a'এটি একটি int
chux - মনিকা পুনরায় ইনস্টল করুন

92

এটি বাস্তবায়ন নির্ভর, কারণ সি স্ট্যান্ডার্ড এর স্বাক্ষরিত নেস সংজ্ঞা দেয় না 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_BITlimits.h। আজ এমন কয়েকটি প্ল্যাটফর্ম রয়েছে যেখানে এটি ব্যতীত অন্য কিছু হবে 8

এই সংখ্যার একটা চমৎকার সারাংশ এখানে

যেমনটি আমি পোস্ট করার পরে অন্যরা উল্লেখ করেছেন, আপনি ব্যবহার করা ভাল int8_tএবং uint8_tআপনি যদি সত্যিই ছোট পূর্ণসংখ্যা উপস্থাপন করতে চান তবে।


2
স্বাক্ষরিত চরের কেবলমাত্র ন্যূনতম -127 থেকে 127 সীমা রয়েছে -128 থেকে 127 পর্যন্ত নয়
12431234123412341234123

3
@ 12431234123412341234123: প্রযুক্তিগতভাবে সত্য, এর সি মান নূন্যতম পরিসীমা হিসাবে -127 থেকে 127 হিসাবে সংজ্ঞায়িত করে। যদিও আমি এমন একটি প্ল্যাটফর্ম খুঁজে পেতে চ্যালেঞ্জ জানাই যা দুটির পরিপূরক গাণিতিক ব্যবহার করে না। প্রায় প্রতিটি আধুনিক প্ল্যাটফর্মে, স্বাক্ষর করা অক্ষরের প্রকৃত পরিসীমা -128 থেকে 127 হবে
টড

CHAR_BITমান দ্বারা কমপক্ষে 8 বিট হওয়া প্রয়োজন।
মার্টিনকুনেভ

39

যেহেতু আমি মনে করি এটি সত্যই জন্য আহ্বান করা হয়েছে, আমি কেবল সি এবং সি ++ এর কিছু নিয়ম বলতে চাই (তারা এ ক্ষেত্রে একই রকম)। প্রথমত, সমস্ত বিট এর unsigned charমান যদি থাকে স্বাক্ষরবিহীন গৃহস্থালির কাজ বস্তুর নির্ধারণে অংশগ্রহণ। দ্বিতীয়ত, unsigned charস্বাক্ষরবিহীনভাবে স্পষ্টভাবে বলা আছে।

এখন, আমি এরকম কি যখন আপনি মান রূপান্তর সম্পর্কে কারও সাথে আলোচনা করতে লাগলেন -1করার int- এ টাইপ unsigned char। তিনি এই ধারণাটি প্রত্যাখ্যান করেছিলেন যে ফলস্বরূপ unsigned charতার সমস্ত বিট 1 তে সেট করা আছে, কারণ তিনি সাইন প্রতিনিধিত্ব সম্পর্কে উদ্বিগ্ন ছিলেন। তবে তার দরকার নেই। এই নিয়মের সাথে সাথেই এটি অনুসরণ করা হচ্ছে যে রূপান্তরটি যা উদ্দেশ্য করে তা করে:

যদি নতুন প্রকারটি স্বাক্ষরবিহীন থাকে, মানটি নতুন ধরণের সীমার মধ্যে না আসা পর্যন্ত নতুন ধরণের প্রতিনিধিত্বযোগ্য সর্বাধিক মানের চেয়ে আরও একবার যোগ বা বিয়োগ করে মানটিকে রূপান্তর করা হয়। ( 6.3.1.3p2একটি C99 খসড়া)

এটি গাণিতিক বিবরণ। সি ++ একে মডুলো ক্যালকুলাসের ক্ষেত্রে বর্ণনা করে যা একই নিয়মে ফল দেয়। যাইহোক, গ্যারান্টিযুক্ত যা নয় তা হ'ল -1রূপান্তরটির আগে পূর্ণসংখ্যার সমস্ত বিট এক হয়। সুতরাং, আমাদের কী আছে তাই আমরা দাবি করতে পারি যে ফলস্বরূপ unsigned charতার সমস্ত CHAR_BITবিট 1 হয়ে গেছে?

  1. সমস্ত বিট তার মান নির্ধারণে অংশ নেয় - অর্থাত্ কোনও বস্তুতে কোন প্যাড বিট হয় না।
  2. কেবলমাত্র এক সময় যুক্ত UCHAR_MAX+1করা -1হলে পরিসীমাটির মান হবেUCHAR_MAX

আসলেই যথেষ্ট! সুতরাং যখনই আপনি unsigned charতার সমস্ত বিট এক পেতে চান, আপনি করেন

unsigned char c = (unsigned char)-1;

এটিও অনুসরণ করে যে কোনও রূপান্তর কেবল উচ্চতর অর্ডার বিটকে কাটা হয় নাদুজনের পরিপূরক জন্য ভাগ্যবান ইভেন্টটি হ'ল এটি কেবল একটি ছাঁটাই, তবে অন্যান্য চিহ্নের উপস্থাপনের ক্ষেত্রে এটি একইভাবে সত্য নয়।


2
শুধু ব্যবহার UCHAR_MAXকরবেন না কেন ?
নিকোলের

1
কারণ (unsigned type)-1একরকম প্রজ্ঞাময়। ~0নয়।
প্যাট্রিক Schlüter

1
যদি আমি ভালো কিছু আছে int x = 1234এবং char *y = &x। বাইনারি উপস্থাপনা 1234 হয় 00000000 00000000 00000100 11010010। আমার মেশিনটি সামান্য এডিয়ান তাই এটি এর বিপরীত হয় এবং 11010010 00000100 00000000 00000000মেমরিে সঞ্চয় করে এলএসবি প্রথমে আসে। এখন মূল অংশ। যদি আমি ব্যবহার printf("%d" , *p)printfপ্রথম বাইট পড়বে 11010010কেবল আউটপুট -46তবে 11010010এটি 210কেন এটি মুদ্রণ করে -46। আমি সত্যই বিভ্রান্ত হয়ে পড়েছি অনুমান করি যে পূর্ণসংখ্যা প্রচারের জন্য কিছু চর কিছু করছে তবে আমি জানি না।
সুরজ জৈন

27

উদাহরণ স্বরূপ স্বাক্ষরিত চরের ব্যবহারগুলি :

unsigned charকম্পিউটার গ্রাফিক্সে প্রায়শই ব্যবহৃত হয়, যা প্রায়শই (যদিও সর্বদা নয়) প্রতিটি রঙের উপাদানকে একটি একক বাইট সরবরাহ করে। এটি একটি আরজিবি (বা আরজিবিএ) রঙটি 24 (বা 32) বিট হিসাবে উপস্থাপন করা প্রত্যক্ষভাবে দেখা যায়, প্রতিটি একটি unsigned char। যেহেতু unsigned charমানগুলি [0,255] এর মধ্যে আসে, তাই মানগুলি সাধারণত হিসাবে ব্যাখ্যা করা হয়:

  • 0 অর্থ প্রদত্ত রঙ উপাদানটির মোট অভাব।
  • 255 অর্থ প্রদত্ত রঙ রঙ্গকের 100%।

সুতরাং আপনার আরজিবি লাল (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) হবে , যা ভুল ।


13

আপনি যদি একটি ছোট ছোট পূর্ণসংখ্যা হিসাবে একটি অক্ষর ব্যবহার করতে চান, তবে এটির সবচেয়ে নিরাপদ উপায়টি int8_tএবং uint8_tপ্রকারগুলি সহ।


2
একটি ভাল ধারণা নয়: int8_tএবং uint8_toptionচ্ছিক এবং আর্কিটেকচারে সংজ্ঞায়িত নয় যেখানে বাইটের আকারটি 8 বিট নয় exactly বিপরীতে, signed charএবং unsigned charসর্বদা উপলব্ধ এবং কমপক্ষে 8 বিট ধরে রাখার গ্যারান্টিযুক্ত। এটি একটি সাধারণ উপায় হতে পারে তবে নিরাপদ নয়
chqrlie

2
এটি একটি মন্তব্য, এটি প্রশ্নের উত্তর দেয় না।
লন্ডিন

@chqrlie সুতরাং আপনার মানে, একটি ছোট পূর্ণসংখ্যার উপস্থাপনের আসল নিরাপদ উপায়, যদি আপনি মেমরিটি সংরক্ষণ করতে চান, তবে তা রাখবেন signed charএবং unsigned char? অথবা আপনি কি সেই বিশেষ ক্ষেত্রে আরও ভাল "নিরাপদ" বিকল্পের পরামর্শ দিতে চান? উদাহরণস্বরূপ "বাস্তব" পূর্ণসংখ্যার প্রকারের সাথে আঁকতে signed intএবং unsigned intপরিবর্তে কোনও কারণে?
রবার্টএস মনিকা সেলিও

@ রবার্টস-রেইনস্টেটমোনিকা: ব্যবহার করা signed charএবং unsigned charসমস্ত কার্যকর প্রয়োগকারীর জন্য বহনযোগ্য এবং স্টোরেজ স্পেস সংরক্ষণ করবে তবে কিছু কোডের আকার বাড়তে পারে। কিছু ক্ষেত্রে, বিটফিল্ডে বা নিয়মিত পূর্ণসংখ্যার একক বিটগুলিতে ছোট মান সংরক্ষণ করে কেউ বেশি স্টোরেজ স্থান বাঁচাতে পারে। এই প্রশ্নের কোনও নিখুঁত উত্তর নেই, এই পদ্ধতির সুক্ষ্মতাটি নির্দিষ্ট হাতের ক্ষেত্রে নির্ভর করে। এবং এই উত্তরটি যাইহোক প্রশ্নের সমাধান করে না।
chqrlie

10

unsigned charকেবল ইতিবাচক মানগুলি নেয় .... যেমন 0 থেকে 255 পর্যন্ত

যেখানে হিসাবে

signed charধনাত্মক এবং নেতিবাচক মান উভয়ই গ্রহণ করে .... যেমন -128 থেকে +127


9

charএবং unsigned charসমস্ত প্ল্যাটফর্মগুলিতে 8-বিট ধরণের হওয়ার গ্যারান্টি নেই - এগুলি 8-বিট বা বড় হওয়ার গ্যারান্টিযুক্ত। কিছু প্ল্যাটফর্মে 9-বিট, 32-বিট, বা 64-বিট বাইট থাকে । তবে, বর্তমানে সর্বাধিক প্রচলিত প্ল্যাটফর্মগুলিতে (উইন্ডোজ, ম্যাক, লিনাক্স x86, ইত্যাদি) 8-বিট বাইট রয়েছে।


8

signed charএর পরিধি -128 থেকে 127; unsigned charপরিসীমা 0 থেকে 255 পর্যন্ত রয়েছে।

char সংকলকটির উপর নির্ভর করে স্বাক্ষর করা চর বা স্বাক্ষরবিহীন চরের সমতুল্য হবে তবে এটি একটি স্বতন্ত্র প্রকার।

আপনি যদি সি-স্টাইলের স্ট্রিং ব্যবহার করছেন তবে কেবল ব্যবহার করুন char। আপনার যদি পাটিগণিতের জন্য চরগুলি ব্যবহার করার প্রয়োজন হয় (খুব বিরল), স্বাক্ষরযুক্ত বা স্বাক্ষরযুক্ত স্বতন্ত্রভাবে বহনযোগ্যতার জন্য নির্দিষ্ট করুন।


8

একটি unsigned charহ'ল স্বাক্ষরযুক্ত বাইট মান (0 থেকে 255)। আপনি charএকটি "চরিত্র" হিসাবে বিবেচনা করতে পারেন তবে এটি সত্যই একটি সংখ্যার মান। নিয়মিত charস্বাক্ষরিত হয়, সুতরাং আপনার 128 টি মান রয়েছে এবং এই মানগুলি ASCII এনকোডিং ব্যবহার করে অক্ষরগুলিতে মানচিত্র করে। তবে উভয় ক্ষেত্রেই, আপনি মেমরিতে যা সঞ্চয় করছেন তা বাইট মান।


7

প্রত্যক্ষ মানগুলির ক্ষেত্রে নিয়মিত চর ব্যবহার করা হয় যখন মানগুলির মধ্যে হয় CHAR_MINএবং CHAR_MAXযখন স্বাক্ষরবিহীন গৃহস্থালিটি ইতিবাচক প্রান্তে দ্বিগুণ পরিসীমা সরবরাহ করে। উদাহরণস্বরূপ, যদি CHAR_BIT8 charহয় তবে নিয়মিত সীমাটি কেবলমাত্র [0, 127] হওয়ার নিশ্চয়তা দেয় (কারণ এটি স্বাক্ষরিত বা স্বাক্ষরিত unsigned charহতে পারে ) যখন হবে [0, 255] এবংsigned char হবে [-127, 127] হবে।

এটি কীসের জন্য ব্যবহার করা হয় তার পদগুলিতে, মানগুলি পিওডের বস্তুগুলিকে (সাধারণ পুরানো ডেটা) সরাসরি স্বাক্ষরবিহীন চরের অ্যারে রূপান্তরিত করতে দেয়। এটি আপনাকে অবজেক্টের উপস্থাপনা এবং বিট নিদর্শনগুলি পরীক্ষা করতে দেয়। নিরাপদ প্রকার শাস্তির একই গ্যারান্টি চর বা স্বাক্ষরিত চরের জন্য বিদ্যমান নেই।


আসলে, এটি বেশিরভাগ ক্ষেত্রেই হবে [-128, 128]।
রাস্তাজেদি

মান শুধুমাত্র আনুষ্ঠানিকভাবে হিসেবে বস্তুর উপস্থাপনা সংজ্ঞায়িত ক্রম এর unsigned charএকটি না অ্যারের বিশেষভাবে, & যে কোনো "রূপান্তর" শুধুমাত্র আনুষ্ঠানিকভাবে দ্বারা সংজ্ঞায়িত করা হয় অনুলিপি একটি বাস্তব করতে বস্তু থেকে ঘোষণা অ্যারে এর unsigned char& তারপর আধুনিক পরিদর্শন। এটি স্পষ্ট নয় যে ওআরকে সরাসরি অ্যারে হিসাবে পুনরায় ব্যাখ্যা করা যেতে পারে, পয়েন্টার পাটিগণিতের জন্য ভাতার সাথে এটি অন্তর্ভুক্ত হবে, অর্থাত ==এই ব্যবহারে "সিক্যুয়েন্স" "অ্যারে" কিনা । এটি পরিষ্কার হওয়ার আশায় একটি কোর ইস্যু # 1701 খোলা আছে। ধন্যবাদ, যেহেতু এই অস্পষ্টতা সত্যিই আমাকে সম্প্রতি বাড়িয়ে তুলছে।
আন্ডারস্কোর_ডে

1
@ রাস্তাজেদি না, এটি হবে না। এটা পারে না। -128 ... + 128 এর একটি পরিসীমা 8 বিট দিয়ে প্রতিনিধিত্ব করা শারীরিকভাবে অসম্ভব। এই প্রস্থটি কেবল 2 ^ 8 == 256 বিচ্ছিন্ন মানগুলিকে সমর্থন করে, তবে -128 ... + 128 = 2 * 128 + 1 0 = 257 এর জন্য Sign শূণ্যসমূহ। টু-এর পরিপূরক উপস্থাপনাটি একটি একক শূন্য বজায় রাখে তবে নেতিবাচক দিকটিতে আরও একটি মান রেখে রেঞ্জটি তৈরি করে; এটি অনুমতি দেয় -128 ... + 127। (এবং আরও বড় বিট প্রস্থে উভয়ের জন্য।)
আন্ডারস্কোর_আগস্ট

আমার দ্বিতীয় মন্তব্যটি পুনরায় করুন, এটি অনুমান করা যুক্তিযুক্ত যে আমরা unsigned charOR এর 1 ম পয়েন্টারটি নিয়ে যেতে পারি এবং তারপরে ++ptrএটির প্রতিটি বাইট পড়তে ব্যবহার করতে এগিয়ে যাই ... তবে আফিক্স, এটি নির্দিষ্টভাবে অনুমোদিত হওয়ার হিসাবে সংজ্ঞায়িত হয়নি, তাই আমরা একটি জিগস ধাঁধা সদৃশ স্ট্যান্ডার্ডে প্রচুর অন্যান্য প্যাসেজগুলি (এবং বিভিন্ন উপায়ে কেবলমাত্র অস্তিত্ব ) থেকে এটি সম্ভবত 'ঠিক আছে' বলে বামে ফেলেছে memcpy। যা আদর্শ নয়। ঠিক আছে, সম্ভবত শব্দটির অবশেষে উন্নতি হবে। এখানে আমি সিডাব্লুজি
আন্ডারস্কোর_আডি

@ মাউন্ডসো_ড দুঃখিত, এটি টাইপো ছিল। [-128, 127] আমি টাইপ করে যা বোঝাতে চেয়েছি তা হল: পি। হ্যাঁ, আমি ডাবল শূন্যগুলি ('ধনাত্মক' এবং 'নেতিবাচক' শূন্য) সাইন / মাত্রার সাথে জানি। আমি অবশ্যই ক্লান্ত হয়ে পড়েছি: পি।
রাস্তাজেদি

5

unsigned charসমস্ত বিট কৌতুক হৃদয় হয়। সমস্ত প্ল্যাটফর্মের জন্য প্রায় সমস্ত সংকলক একটি unsigned charসহজ একটি বাইট এবং (সাধারণত) 8 বিটের স্বাক্ষরবিহীন পূর্ণসংখ্যা যা একটি ছোট পূর্ণসংখ্যা বা বিটের একটি প্যাক হিসাবে বিবেচনা করা যেতে পারে।

আসক্তিতে, অন্য কেউ যেমন বলেছে, মান কোনও চরের চিহ্নটি সংজ্ঞায়িত করে না। তাই আপনি 3 স্বতন্ত্র আছে charপ্রকারসমূহ: char, signed char, unsigned char


1
বিট কৌশল, ওরফে বিট টুইডলিং বা বিট হ্যাকিং প্রকৃতপক্ষে আসক্তির কারণ হিসাবে পরিচিত ;-)
chqrlie

3
এটি 0 এর কারণেই সমস্যা দেখা দেয়। কুঁচকানো থেকে আসক্তি এড়াতে, বাদামি বিট থেকে দূরে থাকুন।
ড্রাগনলর্ড

5

আপনি নির্দিষ্ট দৈর্ঘ্য এবং signedness বিভিন্ন ধরনের ব্যবহার করার মত, আপনি সম্ভবত সাথে উন্নত বন্ধ হন, তাহলে uint8_t, int8_t, uint16_t, ইত্যাদি কারণ তারা তারা ঠিক কি বলে।


4

কিছু পাওয়া Googling এই , যেখানে লোকেরা এ ব্যাপারে আলোচনা করতে লাগলেন।

স্বাক্ষরবিহীন চরটি মূলত একক বাইট। সুতরাং, আপনার যদি কোনও বাইট ডেটা প্রয়োজন হয় তবে আপনি এটি ব্যবহার করবেন (উদাহরণস্বরূপ, সম্ভবত আপনি এটি কোনও ফাংশনে পাস করার জন্য পতাকাগুলি চালু এবং বন্ধ রাখতে ব্যবহার করতে চান, যেমনটি উইন্ডোজ এপিআই-তে প্রায়ই করা হয়)।


4

একটি স্বাক্ষরবিহীন চরটি বিটটি ব্যবহার করে যা অন্য সংখ্যা হিসাবে নিয়মিত চরের স্বাক্ষরের জন্য সংরক্ষিত থাকে। এটি [-128 - 127] এর বিপরীতে [0 - 255] এ ব্যাপ্তি পরিবর্তন করে।

সাধারণত আপনি স্বাক্ষর না চাইলে স্বাক্ষরযুক্ত অক্ষর ব্যবহার করা হয়। স্থান পরিবর্তনকারী বিটগুলি (শিফটটি সাইন বাড়িয়ে তোলে) এবং অন্যান্য বিষয়গুলি যখন সংখ্যা হিসাবে ব্যবহার না করে একটি বাইট হিসাবে ব্যবহার করার সময় অন্যান্য জিনিসগুলি করার সময় এটি একটি তাত্পর্য তৈরি করবে।


4

unsigned charশুধুমাত্র ইতিবাচক মানগুলি নেয়: 0 থেকে 255 এবং signed charধনাত্মক ও নেতিবাচক মানগুলি নেয়: -128 থেকে +127।


3

"সি প্রোগ্রামিং লাগেজ" বইয়ের উদ্ধৃতি

কোয়ালিফায়ার signedবা unsignedচর বা যে কোনও পূর্ণসংখ্যার জন্য প্রয়োগ করা যেতে পারে। স্বাক্ষরবিহীন সংখ্যাগুলি সর্বদা ধনাত্মক বা শূন্য থাকে এবং গাণিতিক মডুলো 2 ^ n এর আইন মেনে চলে, যেখানে এন টাইপের বিটের সংখ্যা। সুতরাং, উদাহরণস্বরূপ, যদি অক্ষরগুলি 8 বিট হয়, স্বাক্ষরযুক্ত চরগুলি 0 এবং 255 এর মধ্যে থাকে তবে স্বাক্ষর করা অক্ষরের মান -128 এবং 127 এর মধ্যে থাকে (দু'জনের পরিপূরক মেশিনে plain) সরল অক্ষর স্বাক্ষরিত বা স্বাক্ষরবিহীন মেশিন কিনা নির্ভরশীল, তবে মুদ্রণযোগ্য অক্ষরগুলি সর্বদা ইতিবাচক থাকে।


2

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.