Theo tiêu chuẩn C ++ n4713 , một đoạn mã tương tự được cung cấp. Loại được sử dụng là BOOL
(tùy chỉnh), nhưng nó có thể áp dụng cho bất kỳ loại nào.
12.2.4
4 Nếu giá trị true hoặc false được lưu trữ trong một trường bitbool
có kích thước bất kỳ (bao gồm cả một trường bit một bit),bool
giá trịban đầuvà giá trị của trường bit sẽ so sánh bằng nhau. Nếu giá trị của một kiểu liệt kê được lưu trữ trong một trường bit của cùng một kiểu liệt kê và số lượng bit trong trường bit đủ lớn để chứa tất cả các giá trị của kiểu liệt kê đó (10.2), thì giá trị của kiểu liệt kê ban đầu và giá trị của trường bit sẽ so sánh bằng nhau . [ Thí dụ:
enum BOOL { FALSE=0, TRUE=1 };
struct A {
BOOL b:1;
};
A a;
void f() {
a.b = TRUE;
if (a.b == TRUE) // yields true
{ /* ... */ }
}
- cuối ví dụ]
Ở cái nhìn đầu tiên, phần in đậm có vẻ mở để giải thích. Tuy nhiên, ý định chính xác trở nên rõ ràng khi enum BOOL
có nguồn gốc từ int
.
enum BOOL : int { FALSE=0, TRUE=1 }; // ***this line
struct mystruct { BOOL enabled:1; };
int main()
{
struct mystruct s;
s.enabled = TRUE;
if(s.enabled == TRUE)
printf("Is enabled\n"); // --> we think this to be printed
else
printf("Is disabled !!\n");
}
Với mã trên, nó đưa ra cảnh báo mà không có -Wall -pedantic
:
cảnh báo: 'mystruct :: enable' quá nhỏ để chứa tất cả các giá trị của 'enum BOOL'
struct mystruct { BOOL enabled:1; };
Đầu ra là:
Bị vô hiệu hóa !! (khi sử dụng enum BOOL : int
)
Nếu enum BOOL : int
được thực hiện đơn giản enum BOOL
, thì kết quả đầu ra như hình dán tiêu chuẩn ở trên chỉ định:
Được bật (khi sử dụng enum BOOL
)
Do đó, cũng có thể kết luận, cũng như một số câu trả lời khác, kiểu đó int
không đủ lớn để lưu trữ giá trị "1" chỉ trong một trường bit đơn lẻ.
int
tôi nghĩ nó chỉ có thể chứa các giá trị0
và-1
.