Tôi chỉ cần một chút để trình bày dữ liệu của mình - 1 hoặc 0. Cách tốt nhất để làm điều đó trong C là gì? Các loại dữ liệu "bình thường" quá lớn.Loại dữ liệu nhỏ nhất - tôi có thể xác định biến số một bit không?
Trả lời
Nếu bạn thực sự muốn, bạn có thể tạo cấu trúc có biến thành viên, bit-fielded đến 1 bit.
Hãy nhớ rằng, loại dữ liệu của biến thành viên cần phải là unsigned
, vì bạn cần lưu trữ 0
và 1
.
Bạn có thể tạo
typedef struct foo
{
unsigned x:1;
} foo;
Trong trường hợp bạn đã nói với trình biên dịch mà bạn sẽ chỉ sử dụng một chút x
.
Nhưng do sắp xếp đóng gói cấu trúc (tiêu chuẩn C cố ý linh hoạt để các trình biên dịch có thể tối ưu hóa theo kiến trúc máy), nó cũng có thể chỉ ra khoảng trống trong bộ nhớ là unsigned
và mảng của foo
s không phải là bitwise tiếp giáp.
Thông thường, đoạn dữ liệu nhỏ nhất có thể định địa chỉ trong C là byte. Bạn không thể có một con trỏ đến một chút, do đó bạn không thể khai báo một biến có kích thước 1 bit. Nhưng như Sourav Ghosh đã chỉ ra, bạn có thể khai báo bitfields, nơi mà một bit được truy cập trực tiếp.
Cách di động là định nghĩa của biến mà từng bit riêng lẻ được sử dụng làm cờ.
#define FLAG_FOO 0
#define FLAG_BAR 1
// in case platform does not support uint8_t
typedef unsigned char uint8_t;
uint8_t flags;
void flag_foo_set()
{
flags |= (1 << FLAG_FOO);
}
void flag_foo_clr()
{
flags &= ~(1 << FLAG_FOO);
}
uint8_t flag_foo_get()
{
return flags & (1 << FLAG_FOO);
}
Trong khi điều này có thể có vẻ superfluos so với các trường bit C. Nó có thể di chuyển về cơ bản mọi trình biên dịch ANSI C.
Rất đơn giản, không 'uint8_t' ** có ** được hỗ trợ bởi * mọi trình biên dịch ANSI C không? Tôi không hoàn toàn chắc chắn. 'unsigned char' có thể là một lựa chọn tốt hơn. – Bathsheba
Không, các kiểu uintX_t chỉ được C99 yêu cầu - cho tính di động đầy đủ, hãy sử dụng 'unsigned char' –
' typedef unsigned char uint8_t; 'có vẻ như có thể gây nguy hiểm cho tôi. – Bathsheba
Nếu bạn không cần hàng triệu của những cờ này hoặc có giới hạn bộ nhớ rất hạn chế, cách tốt nhất là dứt khoát là int
.
Điều này là do int
thường tương ứng với kích thước từ tự nhiên của nền tảng của bạn và có thể được căn chỉnh chính xác, được truy cập nhanh chóng. Máy đọc một từ tại một thời điểm anyways và sử dụng các bit duy nhất yêu cầu masking và chuyển dịch, mà chi phí thời gian. Trên PC thông thường của bạn với gigabyte RAM, điều này sẽ chỉ là ngớ ngẩn.
Nếu mức tiêu thụ bộ nhớ thực sự là một vấn đề, có cấu trúc bitfield.
- 1. MySQL: Loại dữ liệu nhỏ nhất cho một bit
- 2. Có thể xác định số lượng chuyển tiếp bitwise trong một số nguyên 8 bit không?
- 3. Object.CompareTo (Object) cho loại dữ liệu không xác định
- 4. Oracle Xác định Loại Dữ liệu
- 5. Loại trừ các nút con nhất định khi cấu trúc dữ liệu không xác định
- 6. Chúng tôi có thể xác định loại dữ liệu mới trong phiên GDB
- 7. Có loại dữ liệu .NET nhỏ hơn byte không?
- 8. Loại dữ liệu C nào có thể đại diện cho số nhị phân 40 bit?
- 9. Cách tốt nhất để xác định các loại dữ liệu đại số bằng Python là gì?
- 10. Xác định loại dữ liệu của một cột trong SQLite
- 11. Với NSDictionary, bạn có thể xác định loại dữ liệu của giá trị không?
- 12. Tôi có thể kiểm tra xem một biến có thể được truyền sang một loại được chỉ định không?
- 13. tìm đa giác lồi có chứa nhỏ nhất với một số lượng nhất định các điểm
- 14. Có thể có nhiều BST hợp lệ cho một tập dữ liệu nhất định không?
- 15. SQL Server 2005: Xác định kiểu dữ liệu của biến
- 16. Tìm số nguyên nhỏ nhất mà không thể được biểu diễn dưới dạng một IEEE-754 32 bit float
- 17. chọn một số cột nhất định của bảng dữ liệu
- 18. Tôi có thể tránh xác định lại nguồn dữ liệu JNDI khi sử dụng JUnit không?
- 19. Chia nhỏ một khung dữ liệu theo số hàng
- 20. Tôi có thể ngăn chặn một số dữ liệu cụ thể không được deserialized?
- 21. Loại dữ liệu lớn nhất để lưu trữ (và in) một số nguyên là gì?
- 22. Chúng ta có thể định nghĩa một hàm mẫu cho một số kiểu dữ liệu không?
- 23. Javascript: một số nguyên tắc về cách xác định loại dữ liệu mới là gì?
- 24. tại sao các trường bit cho cùng một kiểu dữ liệu có kích thước nhỏ hơn so với trường bit cho kiểu dữ liệu hỗn hợp
- 25. Tạo biến mới dựa trên biến số phân loại Đã có trong Tập dữ liệu
- 26. Chúng tôi có thể xác định thuộc tính tăng tự động trong dữ liệu lõi không?
- 27. Chúng tôi có thể có nhiều nguồn dữ liệu vào một cơ sở dữ liệu duy nhất
- 28. Tôi có thể có một số biến số tham số chung không?
- 29. Angular.js $ http.post Lỗi Loại: Không thể đọc thuộc 'dữ liệu' không xác định
- 30. Chọn loại số nguyên nhỏ nhất dựa trên phao
Bộ nhớ có quá khan hiếm đến nỗi bạn cần lưu trữ các giá trị dưới dạng bit riêng lẻ không? Những gì bạn đang sử dụng nó cho? Có thể có một cách tốt hơn. –