চর কি স্বাক্ষরিত না ডিফল্ট স্বাক্ষরিত?


158

"সি এর সম্পূর্ণ রেফারেন্স" বইয়ে উল্লেখ করা হয়েছে যে charডিফল্ট স্বাক্ষরযুক্ত।

তবে আমি জিসিসির পাশাপাশি ভিজ্যুয়াল স্টুডিওতে এটি যাচাই করার চেষ্টা করছি। এটি এটি ডিফল্ট দ্বারা স্বাক্ষরিত হিসাবে গ্রহণ করছে ।

কোনটি সঠিক?


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

15
আমার মনে হয় আপনি যে বইটি পড়ছেন তা হ'ল সি: দি কমপ্লিট রেফারেন্স , হারবার্ট শিল্ডের লেখা। এই বইটির একটি পর্যালোচনা থেকে ( accu.informika.ru/accu/bookreviews/public/reviews/c/c002173.htm ): আমি এই বইটি সুপারিশ করতে যাচ্ছি না ( আপনারা অনেকেই আমার মতামতকে খুব বেশি ওজন দেন) তবে আমি মনে করি না যে এটি একই রকমের অ্যাপ্রোব্রিমিয়ামের প্রাপ্য যা বৈধভাবে তাঁর অন্য কোনও কাজের ক্ষেত্রে ফেলে দেওয়া হয়েছিল। মাইকেল যেমন বলেছেন, এর চেয়ে আরও ভাল রেফারেন্স হরবিসন অ্যান্ড স্টিল
অলোক সিংহল

আমার দুটি সেন্ট এখানে: যেহেতু charস্বাক্ষরবিহীন হতে পারে, থাম্বের নিয়ম হিসাবে intএকটি মান ব্যবহার করে ব্যবহার করে getchar()যা ফিরে আসতে পারে EOFEOFসাধারণত -1বা অন্যান্য নেতিবাচক মান হিসাবে সংজ্ঞায়িত করা হয়, যা একটিতে সংরক্ষণ করা unsignedআপনি চান তা নয়। এখানে ঘোষণাটি রয়েছে: extern int getchar();বিটিডাব্লু, এই প্রস্তাবটি "সি: এ রেফারেন্স ম্যানুয়াল" বই থেকেও এসেছে।
ম্যাক্সিম চেত্রুস্কা

6
আমার বিশ্বাস করা একটি সি রেফারেন্স হ'ল আইএসও / আইইসি 9899: 2011 :-)
জেফ

3
@ ম্যাক্স চেত্রাস্কা ভাল পরামর্শ কিন্তু খারাপ যুক্তি: এমনকি স্বাক্ষরিত charক্ষেত্রে, আপনাকে intফেরতের মান সংরক্ষণ করতে ব্যবহার করতে হবে।
অ্যান্টি হাপালা

উত্তর:


204

বইটি ভুল। সমতল charস্বাক্ষরিত বা স্বাক্ষরযুক্ত না থাকলে মানটি নির্দিষ্ট করে না ।

বস্তুত, মান তিনটি স্বতন্ত্র ধরনের করবেঃ char, signed charএবং unsigned char। আপনি যদি #include <limits.h>এবং তারপর তাকান CHAR_MIN, আপনি খুঁজে বের করতে পারেন যদি প্লেইন charহয় signedবা unsigned(যদি CHAR_MINকম 0 অথবা 0 সমান), কিন্তু তারপর এমনকি তিন ধরনের স্বতন্ত্র যতটা মান সংশ্লিষ্ট করা হয়।

মনে রাখবেন যে charএইভাবে বিশেষ। যদি আপনি কোনও ভেরিয়েবলকে intঘোষণা করেন তবে এটি হিসাবে এটির ঘোষণার 100% সমতুল্য signed int। এটি সব সংকলক এবং আর্কিটেকচারের জন্য সর্বদা সত্য।


1
@ অলোক: কিছু অন্যান্য ডেটাটাইপগুলির ক্ষেত্রেও এটি একই নয়, উদাহরণস্বরূপ সর্বদা intমানে signed int, তাই না? তা ছাড়া char, অন্যান্য কোন ডেটাটাইপগুলির মধ্যে একই বিভ্রান্তি রয়েছে C?
লেজার

8
@ এসকে: হ্যাঁ, charএকমাত্র টাইপ যা স্বাক্ষরিত বা স্বাক্ষরযুক্ত হতে পারে। উদাহরণস্বরূপ intসমতুল্য signed int
অলোক সিংহল

28
এর একটি হিস্টিরিয়াল, এর, historicalতিহাসিক কারণ রয়েছে - সি এর শুরুর দিকে "স্ট্যান্ডার্ড" কমপক্ষে দুবার ফ্লপ-ফ্লপ হয়েছিল এবং কিছু জনপ্রিয় প্রাথমিক সংকলক এক উপায়ে শেষ করেছেন এবং অন্যরা অন্যটি করেছেন।
হট লিক্স

9
@ অলোকসিংহল: কিছুটা ক্ষেত্রে intস্বাক্ষরিত বা স্বাক্ষরবিহীন কিনা তা এটি বাস্তবায়ন-সংজ্ঞায়িতও ।
কিথ থম্পসন

@ কিথ থমসন সংশোধন করার জন্য ধন্যবাদ। আমি বিট ফিল্ডের প্রকারগুলি সম্পর্কে কিছু বিবরণ ভুলে যাব কারণ আমি সেগুলি বেশি ব্যবহার করি না।
অলোক সিংহল

67

অলোক যেমন উল্লেখ করেছেন , মানকটি প্রয়োগের ক্ষেত্রে তা ছেড়ে দেয়।

জিসিসির জন্য, ডিফল্ট স্বাক্ষরিত হয় তবে আপনি এটির মাধ্যমে এটি সংশোধন করতে পারেন -funsigned-charদ্রষ্টব্য: অ্যান্ড্রয়েড এনডিকে জিসিসির জন্য, ডিফল্টটি স্বাক্ষরবিহীন । আপনি স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত অক্ষরগুলির সাথেও স্পষ্টভাবে জিজ্ঞাসা করতে পারেন -fsigned-char

এমএসভিসি-তে, ডিফল্ট স্বাক্ষরিত হয় তবে আপনি এটি দিয়ে সংশোধন করতে পারেন /J


2
মজার বিষয় যে শিল্ডের বিবরণ এমএসভিসির আচরণের সাথে মেলে না কারণ তাঁর বইগুলি সাধারণত এমএসভিসি ব্যবহারকারীদের দিকে তাকাতে থাকে। আমি ভাবছি এমএস যদি কোনও সময় ডিফল্ট পরিবর্তন করে?
মাইকেল বুড়

1
আমি ভেবেছিলাম এটি সংকলকের উপর নির্ভর করে নয়, প্ল্যাটফর্মে। আমি ভেবেছিলাম চরটি তৃতীয় প্রকারের "চরিত্রের ডেটাটাইপ" হিসাবে বাকী ছিল যা সেই সময়ের সিস্টেমগুলি মুদ্রণযোগ্য অক্ষর হিসাবে ব্যবহৃত হত to
স্পাইডি

10
জিসিসি ডক্স বলব এটা মেশিন-নির্ভরশীল: " মেশিন প্রত্যেকটি ধরনের গৃহস্থালির কাজ কি হওয়া উচিত জন্য একটি ডিফল্ট করেছেন ডিফল্টরূপে বা ডিফল্ট দ্বারা স্বাক্ষরিত গৃহস্থালির কাজ মত স্বাক্ষরবিহীন গৃহস্থালি মত হয় হয়।। "
Deduplicator

1
আপনি কি দয়া করে আপনার নোটের জন্য এমন কোনও উত্স সরবরাহ করতে পারেন যে অ্যান্ড্রয়েডে ডিফল্ট স্বাক্ষরযুক্ত চর নয়?
ফিলিপসি

1
@ স্পিডি সি স্ট্যান্ডার্ডটি সংকলক, প্ল্যাটফর্ম এবং সিপিইউ আর্কিটেকচারের মধ্যে কোনও সত্যিকারের পার্থক্য তৈরি করে না। এটি কেবল "বাস্তবায়ন" এর অধীনে তাদের সকলকে একসাথে।
প্লাগওয়াশ

35

C99 N1256 খসড়া 6.2.5 / 15 "প্রকার" এর স্বাক্ষরিত নেসের প্রকারের কথাটি বলতে হয় char:

বাস্তবায়নের মাধ্যমে চরটি একই স্বাক্ষর, প্রতিনিধিত্ব এবং আচরণ স্বাক্ষরিত চর বা স্বাক্ষরবিহীন চর হিসাবে হবে ine

এবং একটি পাদটীকা:

CHAR_MINসংজ্ঞায়িত <limits.h>, এর মানগুলির একটি 0বা একটি থাকবে SCHAR_MINএবং এটি দুটি বিকল্পকে আলাদা করতে ব্যবহার করা যেতে পারে। পছন্দমত নির্বিশেষে, charঅন্য দুটি থেকে পৃথক প্রকারের এবং কোনওটির সাথেই উপযুক্ত নয়।


7

ডেনিস রিচি র সি প্রোগ্রামিং ল্যাঙ্গুয়েজ বই অনুসারে, যা এএনএসআই সি-এর জন্য ডি-ফ্যাক্টো স্ট্যান্ডার্ড বই, সাদামাটা অক্ষরগুলি স্বাক্ষরিত বা স্বাক্ষরযুক্ত না হয় মেশিন নির্ভর, তবে মুদ্রণযোগ্য অক্ষরগুলি সর্বদা ইতিবাচক থাকে।


9
এটা তোলে অগত্যা ক্ষেত্রে যে না মুদ্রণযোগ্য অক্ষর সবসময় ইতিবাচক। সি স্ট্যান্ডার্ড গ্যারান্টি দেয় যে বেসিক এক্সিকিউশন ক্যারেক্টার সেটটির সমস্ত সদস্যের অ-নেতিবাচক মান রয়েছে।
কিথ থম্পসন

7

সি স্ট্যান্ডার্ড অনুসারে প্লেইন চরের স্বাক্ষরটি "বাস্তবায়ন সংজ্ঞায়িত"।

সাধারণভাবে বাস্তবায়নকারীরা তাদের আর্কিটেকচারে বাস্তবায়নের জন্য যেকোনও দক্ষ বলে বেছে নিয়েছিলেন। X86 সিস্টেমে চর সাধারণত স্বাক্ষরিত হয়। আর্ম সিস্টেমগুলিতে এটি সাধারণত স্বাক্ষরযুক্ত (অ্যাপল আইওএস একটি ব্যতিক্রম)।



2
@plugwash আপনার উত্তর সম্ভবত কারণ downvoted ছিল টিম পোস্ট তার চাবি হারিয়ে । গুরুতরভাবে যদিও, আপনি যতক্ষণ না নিশ্চিত যে আপনার উত্তর সঠিক (যা এটি এই ক্ষেত্রে) ঠিক ততক্ষণ একটিও ডাউন ডাউন সম্পর্কে চিন্তা করবেন না। কোনও বৈধ কারণ ছাড়াই আমার পোস্টগুলি ডাউনভোট করা আমার কাছে বেশ কয়েকবার ঘটেছে। এটি নিয়ে চিন্তা করবেন না, কখনও কখনও লোকেরা কেবল বিজোড় কাজ করে।
ডোনাল্ড হাঁস

1
কেন সই করা চরটি x86 এ আরও দক্ষ? কোন সূত্র?
মার্টিনকুনেভ

2

বাজার্ন স্ট্রোস্ট্রপের "দ্য সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ" অনুসারে, char"বাস্তবায়ন সংজ্ঞায়িত"। এটি হতে পারে signed charবা unsigned charবাস্তবায়নের উপর নির্ভর করে। আপনি charস্বাক্ষর করেছেন কি না তা ব্যবহার করে পরীক্ষা করতে পারেন std::numeric_limits<char>::is_signed


9
এটি একটি সি প্রশ্ন। সি ++ একটি ভিন্ন ভাষা এবং সি ++ রেফারেন্সের সি এর সাথে কোনও মিল নেই
এমএম

1

এখন, আমরা জানি যে মানক পাতাটি কার্যকর হয়।

তবে কীভাবে কোনও ধরণের পরীক্ষা করা যায় signedবা unsignedযেমন char?

এটি করার জন্য আমি একটি ম্যাক্রো লিখেছি:

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

এবং সঙ্গে এটি পরীক্ষা gcc, clangএবং cl। তবে আমি নিশ্চিত নই যে এটি অন্যান্য ক্ষেত্রে সর্বদা নিরাপদ।


সাধারণ CHAR_MIN <0 (বা ডাব্লুসিএইচআর_মিন <0 ডাব্লুচিকার_ টি) এর সাথে কী ভুল?
Öö তিবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.