সি ++ তে কি 'বাইট' ডেটা টাইপ আছে?


86

যদি বিদ্যমান থাকে তবে অন্তর্ভুক্ত করতে শিরোলেখ ফাইল আছে?

এই কোডটি সংকলনের ত্রুটি দেয়:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

15
এটি বলা হয় char
আভিদান বোরিসভ

12
@Ben char হয় অগত্যা এক বাইট। এটি কেবল যে বাইট অগত্যা 8 বিট নয়।
আভিদান বোরিসভ

4
@ বেন: আপনি উপস্থিতিতে আরও বহিরাগত প্ল্যাটফর্মগুলির সাথে দৃশ্যত পরিচিত নন। 8 বিট বাইট প্রাধান্য পাচ্ছে তা নির্বিশেষে একটি বাইট অবশ্যই 8 বিট হিসাবে সংজ্ঞায়িত করা হয়নি। আমাদের জন্য তাই CHAR_BIT। আমি একাধিক এমবেডেড সিস্টেমে কাজ করেছি যেখানে বাইটগুলি দৈর্ঘ্যে 8 বিট নয়। একটি চর 1 টি আকার হিসাবে সংজ্ঞায়িত করা হয়, তাই হ্যাঁ, একটি চর সবসময় বাইট হয়।
এড এস

11
@ বেন: সি এবং সি ++ স্ট্যান্ডার্ডগুলি নির্বিঘ্নে একটি "বাইট" কে এ এর ​​আকার হিসাবে সংজ্ঞায়িত করে char, যা কমপক্ষে 8 বিট। "বাইট" শব্দটি অন্যান্য প্রসঙ্গে আলাদাভাবে সংজ্ঞায়িত করা যেতে পারে, তবে সি বা সি ++ নিয়ে আলোচনা করার সময় মানটির সংজ্ঞাটি বদ্ধ থাকাই ভাল।
কিথ থম্পসন

4
ওপি, আমি আপনার গৃহীত উত্তর পুনর্বিবেচনা করব। সত্যিই। এছাড়াও, যদি কোনও চর 1 মাপের গ্যারান্টিযুক্ত থাকে তবে কেন নোট লিখুন using byte = unsigned charএবং এটি দিয়ে করা হবে (যেমন rmp এর উত্তর থেকে বোঝা যায়)?
einpoklum

উত্তর:


35

না সি ++ তে কোনও বাইট ডেটা টাইপ নেই। তবে আপনি সর্বদা স্ট্যান্ডার্ড লাইব্রেরি থেকে বিটসেট শিরোনাম অন্তর্ভুক্ত করতে পারেন এবং বাইটের জন্য একটি টাইপডেফ তৈরি করতে পারেন:

typedef bitset<8> BYTE;

এনবি: উইনডেফ এইচ উইন্ডোজ কোডের জন্য বাইওয়াইটি সংজ্ঞায়িত করেছে, আপনি যদি উইন্ডোজকে টার্গেট করতে চান তবে আপনি BYTE ব্যতীত অন্য কিছু ব্যবহার করতে চাইতে পারেন।

সম্পাদনা: উত্তরটি ভুল হওয়ার পরামর্শের জবাবে। উত্তরটি ভুল নয়। প্রশ্নটি ছিল "সি ++ তে কোনও 'বাইট' ডেটা টাইপ আছে কি?" উত্তরটি ছিল এবং তা হ'ল: "না, সি ++ তে কোনও বাইট ডেটা টাইপ নেই"।

প্রস্তাবিত সম্ভাব্য বিকল্পের জন্য যা জিজ্ঞাসা করা হয়েছিল যে প্রস্তাবিত বিকল্পটি আরও ভাল কেন?

আমার সি ++ স্ট্যান্ডার্ডের অনুলিপি অনুসারে:

"অক্ষর (চর) হিসাবে ঘোষিত অবজেক্টগুলি বাস্তবায়নের যে কোনও সদস্যের বেসিক চরিত্র সেটটি যথেষ্ট পরিমাণে সংরক্ষণ করতে হবে": 3.9.1.1

আমি এটি পড়তে পরামর্শ দিয়েছিলাম যে কোনও সংকলক বাস্তবায়নের জন্য যদি মৌলিক চরিত্রের সেটটির সদস্যকে সঞ্চয় করতে 16 বিট লাগে তবে একটি চরের আকার 16 বিট হবে। আজকের সংকলকরা চরের জন্য 8 টি বিট ব্যবহার করার ঝোঁক এক জিনিস, তবে আমি যতদূর বলতে পারি এটি অবশ্যই 8 বিট হওয়ার কোনও নিশ্চয়তা নেই।

অন্যদিকে, "শ্রেণীর টেম্পলেট বিটসেট <এন> এমন একটি অবজেক্টের বর্ণনা দেয় যা নির্দিষ্ট সংখ্যক বিট, এন সমন্বিত একটি ক্রম সংরক্ষণ করতে পারে" " : 20.5.1। টেমপ্লেট প্যারামিটার হিসাবে 8 উল্লেখ করে অন্যের শব্দগুলিতে আমি এমন একটি অবজেক্টের সাথে শেষ করি যা 8 টি বিট সমন্বিত একটি ক্রম সঞ্চয় করতে পারে।

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


60
এর bitset<8>চেয়ে ভাল কেমন unsigned char?
কিথ থম্পসন

13
এটা না। স্বাক্ষরবিহীন
চরটি

4
উত্তরটি ভুল, এবং অন্য সবগুলিই ভুল, কেবলমাত্র জোড়দার যা কেবলমাত্র সঠিক উত্তর। বাইট হ'ল BIT_CHAR বিট, 8 বিট নয়।
মার্ক গ্যালেক

14
আপনি এখন এই উত্তরটি আপডেট করতে চান কারণ এখন সেখানে রয়েছেstd::byte
নাথানঅলিভার

4
@ পার্সিক্সটি উফ কেন আমি বললাম BIT_CHAR। এটা একটা রহস্য. মহাবিশ্বের একটি রহস্য ..
মার্ক গ্যালেক 15'20

88

না, byteসি ++ তে " " নামে কোনও প্রকার নেই । আপনি কি বদলে চাই unsigned char(যদি আপনি ঠিক 8 বিট প্রয়োজন, বা, uint8_tথেকে <cstdint>, সি যেহেতু ++, 11 )। নোট করুন যে charঅগত্যা একটি সঠিক বিকল্প নয়, কারণ এটি signed charকিছু সংকলক এবং unsigned charঅন্যদের জন্য।


8
বেশ না। char, signed charএবং unsigned charতিনটি স্বতন্ত্র প্রকার। charঅন্য দুজনের একজনের মতোই উপস্থাপনা রয়েছে।
কিথ থম্পসন

4
যদি unsigned char8 বিটের চেয়ে বড় হয় তবে uint8_tসংজ্ঞা দেওয়া হবে না।
কিথ থম্পসন

4
আপনি যদি উদ্দেশ্য-সি তে থাকেন তবে আপনাকে এর <stdint.h>পরিবর্তে অন্তর্ভুক্ত করতে হতে পারে <cstdint>
ওরিওন ইলেজিল

4
@ orionelenzil প্রশ্নটি সি ++ সম্পর্কে ছিল, উদ্দেশ্য সি নয়
ফারাপ

4
@ ফারাপ - একটি উদ্দেশ্য সি-সি প্রসঙ্গে সি বা সি ++ লেখার ফলে আমার মন্তব্যটি দরকারী হতে পারে।
অরিয়েন্ট ইলেজিল

42

হ্যাঁ, এখানে std::byte(সংজ্ঞায়িত <cstddef>) রয়েছে।

সি ++ 17 এটি চালু করেছে।


4
std::byteগাণিতিক সম্পাদন করতে পারে না, এটি কোনও চুক্তি ভঙ্গকারী হতে পারে।
ফারাপ

4
@ ফারাপ, এটি নির্ভর করে - দুর্ঘটনাক্রমে পাটিগণিত করতে সক্ষম না হওয়া কিছু ব্যবহারের ক্ষেত্রে সুবিধা হিসাবে দেখা যেতে পারে। যেহেতু std::byteশুধু একটি উপরন্তু এক কাজের জন্য ডান টুল নির্বাচন করতে পারবেন (অর্থাত পারেন std::byte, char, unsigned charবা uint_8)।
ম্যাক্সচলেপজিগ

27

আপনি যদি উইন্ডো ব্যবহার করেন তবে উইনডেফ.হ.

typedef unsigned char BYTE;

22

ব্যবহার C++11একটি ম্যানুয়ালি সংজ্ঞায়িত বাইট টাইপ জন্য একটা চমৎকার সংস্করণ হয়:

enum class byte : std::uint8_t {};

এটি জিএসএল অন্তত যা করে।

C++17(প্রায়) দিয়ে শুরু করে এই খুব সংস্করণটিকে স্ট্যান্ডার্ডে সংজ্ঞায়িত করা হয়েছে std::byte(উভয়ের জন্য নীল ম্যাকিনটোসকে ধন্যবাদ)।


4
কেন এই enum ভাল, আপনার মতামত বেশি, typedef unsigned char byte;বা typedef std::uint8_t byte;?
einpoklum

4
@ আইনপোকলুম, এটি সুরক্ষা বাড়ায়। উদাহরণস্বরূপ, আপনি যখন একটি দুর্ঘটনাক্রমে এই জাতীয় বাইট মানটি গুন করেন তখন একটি সংকলন ত্রুটি পাবেন। যদিও এটি এলিয়াসিংয়ে সহায়তা করে না । আপনি যখন সঠিকভাবে এলিফ চান তখন কিছু বাইট আপনার প্রয়োজন হয় char*, unsigned char*বা std::byte*
ম্যাক্সচলেপজিগ

4
std::byteগাণিতিক সম্পাদন না করে ব্যতীত এটি ডিল ব্রেকার হতে পারে।
ফারাপ



1
namespace std
{
  // define std::byte
  enum class byte : unsigned char {};

};

এটি যদি আপনার সি ++ সংস্করণে স্ট্যান্ড না থাকে: বাইট নাম স্পেসের এসটিডিতে একটি বাইট প্রকারটি সংজ্ঞায়িত করবে। সাধারণত আপনি স্টাডিতে জিনিস যুক্ত করতে চান না, তবে এই ক্ষেত্রে এটি একটি স্ট্যান্ডার্ড জিনিস যা অনুপস্থিত।

এসটিডি :: বাইট এসটিএল থেকে আরও অনেক বেশি কাজ করে।

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