C ++ 'da' bayt 'veri türü var mı?


86

Varsa eklenecek başlık dosyası var mı?

Bu kod derleme hatası veriyor:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

15
Denir char.
Avidan Borisov

12
@Ben char olduğu mutlaka bir bayt. Sadece bir baytın mutlaka 8 bit olması gerekmez.
Avidan Borisov

4
@Ben: Görünüşe göre var olan daha egzotik platformlara aşina değilsin. 8 bitlik baytın baskın olmasına bakılmaksızın, bir bayt kesinlikle 8 bit olarak tanımlanmaz. Bu yüzden sahibiz CHAR_BIT. Baytların 8 bit uzunluğunda olmadığı birden fazla gömülü sistem üzerinde çalıştım. Bir karakter 1 boyutuna sahip olacak şekilde tanımlanır, yani evet, bir karakter her zaman bir bayttır.
Ed S.

11
@Ben: C ve C ++ standartları char, en az 8 bit olan a'nın boyutu olarak bir "bayt" ı açık bir şekilde tanımlar . "Bayt" terimi diğer bağlamlarda farklı şekilde tanımlanabilir, ancak C veya C ++ 'dan bahsederken standardın tanımına bağlı kalmak daha iyidir.
Keith Thompson

3
OP, kabul ettiğin cevabı yeniden gözden geçirirdim. Gerçekten mi. Ayrıca, bir karakterin boyutu 1 olması garantiyse, neden not yazıp using byte = unsigned charonunla yapılmalı (rmp'nin cevabının önerdiği gibi)?
einpoklum

Yanıtlar:


35

C ++ 'da bayt veri türü yoktur. Bununla birlikte, her zaman standart kitaplıktan bit kümesi başlığını dahil edebilir ve bayt için bir typedef oluşturabilirsiniz:

typedef bitset<8> BYTE;

Not: WinDef.h'nin Windows kodu için BYTE'yi tanımladığı göz önüne alındığında, Windows'u hedeflemeyi planlıyorsanız BYTE dışında bir şey kullanmak isteyebilirsiniz.

Düzenleme: Cevabın yanlış olduğu önerisine yanıt olarak. Cevap yanlış değil. Soru, "C ++ 'da bir' bayt 'veri türü var mı?" İdi. Cevap şuydu ve şu şekildedir: "Hayır, C ++ 'da bayt veri türü yoktur".

Önerilen olası alternatifle ilgili olarak sorulduğu gibi, önerilen alternatif neden daha iyi?

O zamanki C ++ standardı kopyama göre:

"Karakter (char) olarak bildirilen nesneler, uygulamanın temel karakter kümesinin herhangi bir üyesini saklayacak kadar büyük olacaktır": 3.9.1.1

Bir derleyici uygulamasının temel karakter kümesinin bir üyesini depolamak için 16 bit gerektirmesi durumunda bir karakterin boyutunun 16 bit olacağını önermek için okudum. Bugünün derleyicilerinin bir karakter için 8 bit kullanma eğilimi olması bir şeydir, ancak söyleyebileceğim kadarıyla 8 bit olacağına dair kesinlikle bir garanti yok.

Öte yandan, "sınıf şablonu bit kümesi <N> sabit sayıda bit N'den oluşan bir diziyi depolayabilen bir nesneyi tanımlar." : 20.5.1. Diğer bir deyişle şablon parametresi olarak 8 belirterek, sonunda 8 bitten oluşan bir diziyi saklayabilen bir nesne elde ediyorum.

Alternatifin yazılan program bağlamında char için daha iyi olup olmadığı, bu nedenle, anladığım kadarıyla, yanılsam da, derleyicinize ve o andaki gereksinimlerinize bağlıdır. Bu nedenle, bana göre, önerilen alternatifin kendi gereksinimleri / istekleri / ihtiyaçları için uygun olup olmadığını belirlemek, kodu yazan kişiye kalmıştı.


60
Nasıl daha bitset<8>iyi unsigned char?
Keith Thompson

13
Değil. işaretsiz karakter kullan
YasserAsmi

2
Cevap yanlış ve tek doğru cevap olan jwodder dışında diğer tüm sorular da yanlış. bayt, 8 bit değil, BIT_CHAR bittir.
Mark Galeck

14
Şu anda olduğu için bu yanıtı güncellemek isteyebilirsinizstd::byte
NathanOliver

1
@Persixty oops neden dedim BIT_CHAR. Bu bir gizem. Evrenin bir sır ..
Mark Galeck

88

Hayır, byteC ++ 'da " " adlı bir tür yoktur . Bunun yerine ne istiyor ise unsigned char(eğer tam 8 bit gerekiyorsa, ya uint8_tdan <cstdint>, C beri ++ 11 ). Bazı derleyicilerde ve diğerlerinde charolduğu gibi, bunun mutlaka doğru bir alternatif olmadığını unutmayın .signed charunsigned char


8
Pek değil. char, signed charve unsigned charüç farklı türdür. chardiğer ikisinden biriyle aynı temsile sahiptir.
Keith Thompson

2
Eğer unsigned char8 bitten daha büyük, daha sonra uint8_ttanımlanan edilmeyecektir.
Keith Thompson

1
Eğer hedef-c içindeyseniz, <stdint.h>bunun yerine eklemeniz gerekebilir <cstdint>.
orion elenzil

2
@orionelenzil Soru C ++ ile ilgiliydi, C ile
ilgiliydi

2
@pharap - Objective-C bağlamında C veya C ++ yazan biri yorumumu faydalı bulabilir.
orion elenzil

42

Evet, var std::byte(içinde tanımlanmış <cstddef>).

C ++ 17 bunu tanıttı.


2
std::byteüzerinde aritmetik uygulanamaz, bu da bir anlaşma kırıcı olabilir.
Pharap

3
@Pharap, buna bağlıdır - yanlışlıkla aritmetik yapamamak, bazı kullanım durumları için avantaj olarak görülebilir. Yana std::bytesadece bir ektir biri (yani her iki iş için doğru aracı seçebilir std::byte, char, unsigned charveya uint_8).
maxschlepzig

27

Windows kullanıyorsanız, WinDef.h içinde:

typedef unsigned char BYTE;

22

Kullanımı C++11manuel tanımlanmış bayt türü için güzel bir sürümü var olduğunu:

enum class byte : std::uint8_t {};

En azından GSL'nin yaptığı bu.

C++17(Neredeyse) ile başlayan bu sürüm, standartta şu şekilde tanımlanmıştır std::byte(her ikisi için Neil Macintosh'a teşekkürler).


4
Sizce bu sıralama neden typedef unsigned char byte;veya değerinden daha iyi typedef std::uint8_t byte;?
einpoklum

2
@einpoklum, tip güvenliğini artırır. Örneğin, yanlışlıkla böyle bir bayt değerini çarptığınızda derleme hatası alırsınız. Örtüşme konusunda yardımcı olmasa da . Doğru şekilde takma ad istediğinizde char*, ihtiyacınız olan bazı baytlar , unsigned char*veya std::byte*.
maxschlepzig

1
Bunun dışında std::bytebir anlaşma kırıcı olabilecek aritmetik uygulanamaz.
Pharap



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

};

Bu, C ++ sürümünüzde std :: bayt yoksa, ad alanı std'de bir bayt türü tanımlayacaktır. Normalde std'ye bir şeyler eklemek istemezsiniz, ancak bu durumda eksik olan standart bir şeydir.

STL'deki std :: byte çok daha fazla işlem yapar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.