2011-12-14 14 views
15

Tôi đã đọc C++ FAQ và nó nóiInt8_t là gì nếu một máy có> 8 bit trên mỗi byte?

ngôn ngữ C++ đảm bảo một byte phải lúc nào cũng có ít nhất 8 bit

Vậy điều đó có nghĩa là cho <cstdint> loại?

Câu hỏi phụ - nếu tôi muốn một mảng byte, tôi nên sử dụng int8_t hoặc char và tại sao?

+1

Về mặt kỹ thuật, đó là câu hỏi C, vì các loại được gọi lại theo tiêu chuẩn C (§7.18). – kennytm

Trả lời

14

C++ (và C) cũng định nghĩa intX_t (tức là các loại số nguyên chiều rộng chính xác) typedefs là tùy chọn. Vì vậy, nó chỉ sẽ không có nếu không có đơn vị địa chỉ đó là chính xác 8-bit rộng.

Nếu bạn muốn một mảng byte, bạn nên sử dụng char, như sizeof char (và signed charunsigned char) là rõ ràng để luôn là 1 byte.

+2

Chờ, nếu tôi nhớ lại đúng sizeof char được định nghĩa là 1, nhưng tiêu chuẩn không chỉ định wheter là 1 byte hoặc cái gì khác – BlackBear

+0

@BlackBear: Không, tiêu chuẩn rất rõ ràng. 'sizeof' trả về kích thước theo byte và' sizeof (char) == 1'. –

+4

Làm cách nào để tôi xử lý IO trên các hệ thống với các byte có kích thước khác nhau? Hay tôi thậm chí không nên thử? – David

2

Để thêm vào những gì Cát Plus Plus đã nói (rằng loại là tùy chọn), bạn có thể kiểm tra xem nó hiện diện bằng cách sử dụng một cái gì đó như:

#ifdef INT8_MAX 
// type int8_t exists. 
#endif 

hoặc nhiều khả năng:

#ifndef INT8_MAX 
#error Machines with bytes that don't have 8 bits aren't supported 
#endif 
+1

Trình biên dịch có thể xác định 'int8_t' và tính toán trong phần mềm trong khi máy không phải là 8 bit trên mỗi byte. – Dani

+0

Tôi không chắc chắn về điều đó. Tôi nghĩ rằng 'int8_t' được cho là một typedef cho một trong các kiểu tích phân cơ bản. Nhưng tôi không chắc chắn. Việc thực hiện như vậy sẽ rất chậm trên một máy có bổ sung 9 bit 1 (một số Unisys). –

+0

@JamesKanze, đó chính xác là lý do tại sao bạn nên sử dụng các loại "gốc" bất cứ khi nào có thể. – vonbrand

Các vấn đề liên quan