C ++ में 'बाइट' डेटा प्रकार है?


85

अगर मौजूद है तो इसमें शामिल करने के लिए हेडर फ़ाइल है?

यह कोड संकलन त्रुटि देता है:

#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
@Ben: C और C ++ मानकों को स्पष्ट रूप से एक "बाइट" के आकार के रूप में परिभाषित करता है char, जो कि कम से कम है 8 बिट। शब्द "बाइट" को अन्य संदर्भों में अलग तरह से परिभाषित किया जा सकता है, लेकिन जब सी या सी ++ की चर्चा करते हैं तो मानक की परिभाषा से चिपकना बेहतर होता है।
कीथ थॉम्पसन

3
ओपी, मैं आपके स्वीकृत उत्तर पर पुनर्विचार करना चाहूंगा। वास्तव में। इसके अलावा, अगर एक चार्ट का आकार 1 होने की गारंटी है, तो नोट क्यों लिखें using byte = unsigned charऔर उसके साथ क्या करें (जैसे कि आरएमपी का उत्तर बताता है)?
einpoklum

जवाबों:


34

नहीं, C ++ में कोई बाइट डेटा प्रकार नहीं है। हालाँकि आप हमेशा मानक लाइब्रेरी से बिटसेट हेडर को शामिल कर सकते हैं और बाइट के लिए एक टाइपफेड बना सकते हैं:

typedef bitset<8> BYTE;

NB: यह देखते हुए कि WinDef.h विंडोज़ कोड के लिए BYTE को परिभाषित करता है, यदि आप Windows को लक्षित करने का इरादा रखते हैं, तो आप BYTE के अलावा किसी अन्य चीज़ का उपयोग करना चाह सकते हैं।

संपादित करें: सुझाव के जवाब में कि उत्तर गलत है। उत्तर गलत नहीं है। सवाल था "क्या C ++ में एक 'बाइट' डेटा प्रकार है?"। उत्तर था और है: "नहीं, C ++ में कोई बाइट डेटा प्रकार नहीं है" जैसा कि उत्तर दिया गया है।

सुझाए गए संभावित विकल्प के संबंध में, जिसके लिए यह पूछा गया था कि सुझाया गया विकल्प बेहतर क्यों है?

सी ++ मानक की मेरी प्रति के अनुसार, उस समय:

"वर्ण (चार) के रूप में घोषित की गई वस्तुएं लागू किए गए बुनियादी चरित्र सेट के किसी भी सदस्य को संग्रहीत करने के लिए पर्याप्त बड़ी होंगी": 3.9.1.1

मैंने पढ़ा कि सुझाव देने के लिए कि यदि किसी कंपाइलर के कार्यान्वयन के लिए 16 बिट्स की आवश्यकता होती है, तो बेसिक कैरेक्टर सेट के एक सदस्य को स्टोर करने के लिए एक चार का आकार 16 बिट्स का होना चाहिए। आज के कंपाइलर एक चर के लिए 8 बिट्स का उपयोग करते हैं, लेकिन एक बात जहां तक ​​मैं बता सकता हूं, निश्चित रूप से इसकी कोई गारंटी नहीं है कि यह 8 बिट्स होगा।

दूसरी ओर, "क्लास टेम्पलेट बिटसेट <एन> एक ऑब्जेक्ट का वर्णन करता है जो बिट्स की एक निश्चित संख्या से मिलकर एक अनुक्रम स्टोर कर सकता है, एन।" : 20.5.1। टेम्पलेट के पैरामीटर के रूप में 8 निर्दिष्ट करके अन्य पासवर्ड में, मैं एक वस्तु के साथ समाप्त होता हूं जो 8 बिट्स के अनुक्रम को स्टोर कर सकता है।

कार्यक्रम के संदर्भ में, चार का विकल्प बेहतर है या नहीं, इसलिए निर्भर करता है, जहां तक ​​मैं समझता हूं, हालांकि मैं आपके कंपाइलर और उस समय की आवश्यकताओं पर गलत हो सकता हूं। इसलिए यह कोड लिखने वाले व्यक्ति के ऊपर था, जहां तक ​​मेरा सवाल है, यह निर्धारित करने के लिए कि क्या सुझाया गया विकल्प उनकी आवश्यकताओं / जरूरतों या जरूरतों के लिए उपयुक्त था।


59
से bitset<8>बेहतर कैसे है unsigned char?
कीथ थॉम्पसन

12
यह। अहस्ताक्षरित चार का उपयोग करें
YasserAsmi

2
उत्तर गलत है, और अन्य सभी गलत हैं, सिवाय jwodder के जो एकमात्र सही उत्तर है। बाइट BIT_CHAR बिट्स है, न कि 8 बिट्स।
मार्क गैलेक

14
आप शायद इस जवाब को अपडेट करना चाहते हैं क्योंकि अब एकstd::byte
NathanOliver

1
@Persixty ने कहा कि मैंने क्यों कहा BIT_CHAR? यह एक रहस्य है। ब्रह्मांड का एक रहस्य ..
मार्क गैलेक

87

नहीं, byteC ++ में कोई प्रकार नहीं है। क्या आप के बजाय चाहते हैं unsigned char(यदि आप वास्तव में 8 बिट की जरूरत है, या, uint8_tसे <cstdint>, सी के बाद से ++ 11 )। ध्यान दें कि charआवश्यक रूप से एक सटीक विकल्प नहीं है, क्योंकि इसका मतलब signed charकुछ संकलक और unsigned charअन्य पर है।


8
काफी नहीं। char, signed charऔर unsigned charतीन अलग-अलग प्रकार हैं। charअन्य दो में से एक के रूप में एक ही प्रतिनिधित्व है।
कीथ थॉम्पसन

2
यदि unsigned char8 बिट्स से बड़ा है, तो uint8_tपरिभाषित नहीं किया जाएगा।
कीथ थॉम्पसन

1
यदि आप ऑब्जेक्टिव-सी में हैं, तो आपको <stdint.h>इसके बजाय शामिल करने की आवश्यकता हो सकती है <cstdint>
ओरियन एल्जेनिल

2
@orionelenzil प्रश्न C ++ के बारे में था, न कि उद्देश्य C.
चरण 13

2
@ सर्प - वस्तुनिष्ठ-सी संदर्भ में एक या C ++ लिखने से मेरी टिप्पणी उपयोगी हो सकती है।
ओरियन एल्जेनिल

42

हाँ, वहाँ है std::byte(में परिभाषित)<cstddef> ) है।

C ++ 17 ने इसे पेश किया।


2
std::byteउस पर अंकगणित नहीं किया जा सकता है, जो एक सौदा ब्रेकर हो सकता है।
छपरा

3
@ प्रिंट, यह निर्भर करता है - गलती से अंकगणित करने में सक्षम नहीं होना कुछ उपयोग मामलों के लिए लाभ के रूप में देखा जा सकता है। के बाद से std::byteसिर्फ एक है एक नौकरी के लिए सही उपकरण का चयन कर सकते (यानी या तो std::byte, char, unsigned charया uint_8)।
maxschlepzig

27

अगर आप विन्डेफ में विंडोज़ का उपयोग कर रहे हैं, तो आपके पास:

typedef unsigned char BYTE;

22

C++11मैन्युअल रूप से परिभाषित बाइट प्रकार के लिए एक अच्छा संस्करण का उपयोग करना है:

enum class byte : std::uint8_t {};

कम से कम जीएसएल क्या करता है।

के साथ शुरू C++17(लगभग) यह बहुत ही संस्करण मानक के रूप में परिभाषित किया गया है std::byte(दोनों के लिए धन्यवाद नील मैकिंटोश)।


4
आपकी राय में, typedef unsigned char byte;या इससे बेहतर यह एनम बेहतर क्यों है typedef std::uint8_t byte;?
ईनपोक्लुम

2
@einpoklum, यह प्रकार की सुरक्षा को बढ़ाता है। उदाहरण के लिए, आपको एक संकलित त्रुटि मिलती है जब आप गलती से इस तरह के बाइट को गुणा करते हैं। यद्यपि यह अलियासिंग के साथ मदद नहीं करता है । जब आप कुछ बाइट्स ठीक से चाहते हैं char*, unsigned char*या std::byte*
मैक्सक्लेपजिग

1
सिवाय इसके std::byteउस पर प्रदर्शन किया अंकगणित नहीं हो सकता है, जो एक सौदा ब्रेकर हो सकता है।
छप



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

};

यह तब होता है जब आपके C ++ संस्करण में std :: byte नाम स्थान std में बाइट प्रकार को परिभाषित नहीं करेगा। आम तौर पर आप चीजों को एसटीडी में जोड़ना नहीं चाहते हैं, लेकिन इस मामले में यह एक मानक चीज है जो गायब है।

std :: STL से बाइट अधिक संचालन करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.