Có kiểu dữ liệu 'byte' trong C ++ không?


85

Nếu tồn tại, có tệp tiêu đề để bao gồm không?

Mã này gây ra lỗi biên dịch:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

15
Nó được gọi là char.
Avidan Borisov

12
@Ben nhất thiết phải char một byte. Nó chỉ là một byte không nhất thiết phải là 8 bit.
Avidan Borisov

4
@Ben: Bạn dường như không quen thuộc với các nền tảng kỳ lạ hơn đang tồn tại. Một byte chắc chắn không được định nghĩa là 8 bit, bất kể thực tế là 8 bit chiếm ưu thế. Đó là lý do tại sao chúng tôi có CHAR_BIT. Tôi đã làm việc trên nhiều hệ thống nhúng trong đó byte không có độ dài 8 bit. Một char được định nghĩa có kích thước bằng 1, vì vậy có, một char luôn là một byte.
Ed S.

11
@Ben: Các tiêu chuẩn C và C ++ xác định rõ ràng một "byte" là kích thước của a char, ít nhất là 8 bit. Thuật ngữ "byte" có thể được định nghĩa khác nhau trong các ngữ cảnh khác, nhưng khi thảo luận về C hoặc C ++, tốt hơn là nên bám sát định nghĩa của tiêu chuẩn.
Keith Thompson

3
OP, tôi muốn xem xét lại câu trả lời được chấp nhận của bạn. Có thật không. Ngoài ra, Nếu một char được đảm bảo có kích thước 1, tại sao ghi chú lại được viết using byte = unsigned charvà thực hiện với nó (như câu trả lời của rmp gợi ý)?
einpoklum

Câu trả lời:


34

Không, không có kiểu dữ liệu byte trong C ++. Tuy nhiên, bạn luôn có thể bao gồm tiêu đề tập hợp bit từ thư viện chuẩn và tạo định dạng cho byte:

typedef bitset<8> BYTE;

NB: Do WinDef.h định nghĩa BYTE cho mã cửa sổ, bạn có thể muốn sử dụng thứ gì đó khác BYTE nếu bạn có ý định nhắm mục tiêu Windows.

Chỉnh sửa: Đáp lại gợi ý rằng câu trả lời là sai. Câu trả lời là không sai. Câu hỏi đặt ra là "Có kiểu dữ liệu 'byte' trong C ++ không?". Câu trả lời là: "Không, không có kiểu dữ liệu byte trong C ++" như đã trả lời.

Liên quan đến phương án thay thế có thể được đề xuất mà người ta đã hỏi tại sao phương án được đề xuất lại tốt hơn?

Theo bản sao của tôi về tiêu chuẩn C ++, vào thời điểm đó:

"Các đối tượng được khai báo dưới dạng ký tự (char) phải đủ lớn để lưu trữ bất kỳ thành viên nào của bộ ký tự cơ bản triển khai": 3.9.1.1

Tôi đọc điều đó để gợi ý rằng nếu việc triển khai trình biên dịch yêu cầu 16 bit để lưu trữ một thành viên của bộ ký tự cơ bản thì kích thước của một char sẽ là 16 bit. Rằng các trình biên dịch ngày nay có xu hướng sử dụng 8 bit cho một ký tự là một chuyện, nhưng theo như tôi có thể nói thì chắc chắn không có gì đảm bảo rằng nó sẽ là 8 bit.

Mặt khác, "bộ bit mẫu của lớp <N> mô tả một đối tượng có thể lưu trữ một chuỗi bao gồm một số bit cố định, N." : 20.5.1. Trong các từ khác, bằng cách chỉ định 8 làm tham số mẫu, tôi kết thúc với một đối tượng có thể lưu trữ một chuỗi bao gồm 8 bit.

Do đó, theo như tôi hiểu thì lựa chọn thay thế tốt hơn cho char có tốt hơn hay không tùy thuộc vào trình biên dịch của bạn và yêu cầu của bạn tại thời điểm đó. Do đó, tùy thuộc vào cá nhân viết mã, theo như tôi có, để xác định xem liệu giải pháp thay thế được đề xuất có phù hợp với yêu cầu / mong muốn / nhu cầu của họ hay không.


59
Làm thế nào là bitset<8>tốt hơn unsigned char?
Keith Thompson

12
Nó không thể. sử dụng unsigned char
YasserAsmi

2
Câu trả lời là sai và tất cả những câu khác đều sai, ngoại trừ jwodder là câu trả lời đúng duy nhất. byte là bit BIT_CHAR, không phải 8 bit.
Mark Galeck

14
Bạn có thể muốn cập nhật câu trả lời này là bây giờ có mộtstd::byte
NathanOliver

1
@Persixty rất tiếc tại sao tôi lại nói BIT_CHAR. Đó là một bí ẩn. Một bí ẩn của vũ trụ ..
Mark Galeck

87

Không, không có kiểu nào được gọi là " byte" trong C ++. Thay vào đó, những gì bạn muốn là unsigned char(hoặc, nếu bạn cần chính xác 8 bit, uint8_ttừ <cstdint>, kể từ C ++ 11 ). Lưu ý rằng đó charkhông nhất thiết là một sự thay thế chính xác, vì nó có nghĩa là signed chartrên một số trình biên dịch và unsigned charnhững trình biên dịch khác.


8
Không hẳn. char, signed charunsigned charlà ba loại riêng biệt. charcó cùng cách biểu diễn một trong hai phần còn lại.
Keith Thompson

2
Nếu unsigned charlớn hơn 8 bit, thì uint8_tsẽ không được xác định.
Keith Thompson

1
nếu bạn đang ở mục tiêu-c, bạn có thể cần phải bao gồm <stdint.h>thay vì <cstdint>.
orion elenzil

2
@orionelenzil Câu hỏi đặt ra là về C ++, không khách quan C.
Pharap

2
@pharap - một người viết C hoặc C ++ trong ngữ cảnh Objective-C có thể thấy nhận xét của tôi hữu ích.
orion elenzil

42

Có, có std::byte(được định nghĩa trong <cstddef>).

C ++ 17 đã giới thiệu nó.


2
std::bytekhông thể thực hiện số học trên nó, đó có thể là một công cụ phá vỡ giao dịch.
Pharap

3
@Pharap, nó phụ thuộc - không thể vô tình làm số học có thể được coi là lợi thế cho một số trường hợp sử dụng. Kể từ khi std::bytechỉ là một sự bổ sung người ta có thể chọn đúng công cụ cho công việc (tức là một trong hai std::byte, char, unsigned charhoặc uint_8).
maxschlepzig

27

nếu bạn đang sử dụng windows, trong WinDef.h bạn có:

typedef unsigned char BYTE;

22

Sử dụng C++11có một phiên bản đẹp cho loại byte được xác định thủ công:

enum class byte : std::uint8_t {};

Đó ít nhất là những gì GSL làm.

Bắt đầu với C++17(gần như) chính phiên bản này được định nghĩa trong tiêu chuẩn là std::byte(cảm ơn Neil Macintosh cho cả hai).


4
Theo bạn, tại sao enum này tốt hơn typedef unsigned char byte;hoặc typedef std::uint8_t byte;?
einpoklum

2
@einpoklum, nó tăng độ an toàn cho kiểu. Ví dụ: bạn gặp lỗi biên dịch khi bạn vô tình nhân một giá trị byte như vậy. Mặc dù nó không giúp ích gì với răng cưa . Khi bạn muốn bí danh chính xác, một số byte bạn cần char*, unsigned char*hoặc std::byte*.
maxschlepzig

1
Ngoại trừ việc std::bytekhông thể thực hiện số học trên đó, điều này có thể là một công cụ phá vỡ giao dịch.
Pharap



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

};

Điều này nếu phiên bản C ++ của bạn không có std :: byte sẽ xác định một kiểu byte trong không gian tên std. Thông thường bạn không muốn thêm những thứ vào std, nhưng trong trường hợp này, nó là một thứ tiêu chuẩn bị thiếu.

std :: byte từ STL thực hiện nhiều hoạt động hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.