ถ้ามีอยู่มีไฟล์ส่วนหัวที่จะรวม?
รหัสนี้ให้ข้อผิดพลาดในการคอมไพล์:
#include <iostream>
using namespace std;
int main()
{
byte b = 2;
cout << b << endl;
return 0;
}
ถ้ามีอยู่มีไฟล์ส่วนหัวที่จะรวม?
รหัสนี้ให้ข้อผิดพลาดในการคอมไพล์:
#include <iostream>
using namespace std;
int main()
{
byte b = 2;
cout << b << endl;
return 0;
}
char คือจำเป็นต้องหนึ่งไบต์ แค่ไบต์ไม่จำเป็นต้องเป็น 8 บิต
CHAR_BITนั่นเป็นเหตุผลที่เรามี ฉันทำงานกับระบบฝังตัวมากกว่าหนึ่งระบบโดยที่ไบต์มีความยาวไม่เกิน 8 บิต ถ่านถูกกำหนดให้มีขนาด 1 ดังนั้นใช่ถ่านจึงเป็นไบต์เสมอ
charซึ่งมีค่าอย่างน้อย 8 บิต คำว่า "ไบต์" อาจกำหนดแตกต่างกันในบริบทอื่น ๆ แต่เมื่อพูดถึง C หรือ C ++ ควรยึดตามคำจำกัดความของมาตรฐาน
using byte = unsigned charและทำด้วย (เช่นคำตอบของ rmp แนะนำ)
คำตอบ:
ไม่มีประเภทข้อมูลไบต์ใน C ++ อย่างไรก็ตามคุณสามารถรวมส่วนหัวบิตเซ็ตจากไลบรารีมาตรฐานและสร้าง typedef สำหรับไบต์:
typedef bitset<8> BYTE;
หมายเหตุ: เนื่องจาก WinDef.h กำหนด BYTE สำหรับรหัส windows คุณอาจต้องการใช้อย่างอื่นที่ไม่ใช่ BYTE หากคุณต้องการกำหนดเป้าหมาย Windows
แก้ไข: เพื่อตอบข้อเสนอแนะว่าคำตอบนั้นผิด คำตอบคือไม่ผิด คำถามคือ "มีประเภทข้อมูล" ไบต์ "ใน C ++ หรือไม่" คำตอบคือและคือ: "ไม่มีประเภทข้อมูลไบต์ใน C ++" ตามที่ตอบ
เกี่ยวกับทางเลือกที่เป็นไปได้ที่แนะนำซึ่งถูกถามว่าทำไมทางเลือกที่แนะนำจึงดีกว่า
ตามสำเนามาตรฐาน C ++ ของฉันในเวลา:
"ออบเจ็กต์ที่ประกาศเป็นอักขระ (ถ่าน) จะต้องมีขนาดใหญ่พอที่จะจัดเก็บสมาชิกใด ๆ ของชุดอักขระพื้นฐานของการนำไปใช้งาน": 3.9.1.1
ฉันอ่านแล้วเพื่อแนะนำว่าหากการใช้งานคอมไพเลอร์ต้องใช้ 16 บิตในการจัดเก็บสมาชิกของชุดอักขระพื้นฐานขนาดของอักขระจะเป็น 16 บิต คอมไพเลอร์ในปัจจุบันมักจะใช้ 8 บิตสำหรับ char เป็นสิ่งหนึ่ง แต่เท่าที่ฉันสามารถบอกได้ไม่มีการรับประกันอย่างแน่นอนว่ามันจะเป็น 8 บิต
ในทางกลับกัน "บิตเซ็ตเทมเพลตคลาส <N> อธิบายถึงออบเจ็กต์ที่สามารถจัดเก็บลำดับที่ประกอบด้วยจำนวนบิตคงที่, N" : 20.5.1. ในคำอื่น ๆ โดยระบุ 8 เป็นพารามิเตอร์เทมเพลตฉันลงท้ายด้วยอ็อบเจ็กต์ที่สามารถจัดเก็บลำดับที่ประกอบด้วย 8 บิต
ทางเลือกอื่นจะดีกว่าถ่านหรือไม่ในบริบทของโปรแกรมที่เขียนดังนั้นเท่าที่ฉันเข้าใจแม้ว่าฉันอาจจะผิดตามคอมไพเลอร์ของคุณและความต้องการของคุณในเวลานั้น ดังนั้นมันจึงขึ้นอยู่กับแต่ละคนที่เขียนโค้ดเท่าที่ฉันกังวลในการพิจารณาว่าทางเลือกที่แนะนำนั้นเหมาะสมกับความต้องการ / ความต้องการ / ความต้องการของพวกเขาหรือไม่
bitset<8>ดีกว่าunsigned charอย่างไร?
std::byte
BIT_CHARโอ๊ะทำไมผมพูด มันเป็นเรื่องลึกลับ ความลึกลับของจักรวาล ..
ไม่ไม่มีประเภทที่เรียกว่า " byte" ใน C ++ สิ่งที่คุณต้องการแทนคือunsigned char(หรือถ้าคุณต้องการตรง 8 บิต, uint8_tจาก<cstdint>, ตั้งแต่ C ++ 11 ) โปรดทราบว่าcharไม่จำเป็นต้องเป็นทางเลือกอื่นที่ถูกต้องเนื่องจากหมายถึงsigned charคอมไพเลอร์บางตัวและตัวunsigned charอื่น ๆ
char, signed charและunsigned charสามประเภทที่แตกต่างกัน charมีการแสดงเช่นเดียวกับหนึ่งในอีกสองรายการ
unsigned charมีขนาดใหญ่กว่า 8 บิตuint8_tจะไม่ถูกกำหนด
<stdint.h> <cstdint>
std::byteไม่สามารถคำนวณเลขคณิตได้ซึ่งอาจเป็นตัวทำลายข้อตกลง
std::byteเป็นเพียงหนึ่งนอกจากนี้ยังสามารถเลือกเครื่องมือที่เหมาะสมสำหรับงาน (เช่นอย่างใดอย่างหนึ่งstd::byte, char, unsigned charหรือuint_8)
หากคุณใช้ windows ใน WinDef.h คุณมี:
typedef unsigned char BYTE;
typedef unsigned char byte;หรือtypedef std::uint8_t byte;?
char*, หรือunsigned char* std::byte*
std::byteไม่สามารถคำนวณเลขคณิตได้ซึ่งอาจเป็นตัวทำลายข้อตกลง
ไม่มี แต่ตั้งแต่ C ++ 11 มี[u] int8_t
นอกจากนี้ยังมีbyte_lite ที่เข้ากันได้กับ C ++ 98, C ++ 11 และใหม่กว่า
namespace std
{
// define std::byte
enum class byte : unsigned char {};
};
หากเวอร์ชัน C ++ ของคุณไม่มี std :: byte จะกำหนดประเภทไบต์ใน namespace std โดยปกติคุณไม่ต้องการเพิ่มสิ่งต่างๆใน std แต่ในกรณีนี้มันเป็นสิ่งมาตรฐานที่หายไป
std :: byte จาก STL ทำงานได้มากขึ้น
char.