Tôi khuyên bạn nên làm điều đó chính xác như bạn đã thể hiện, vì đó là cách đơn giản nhất. Khởi tạo để luôn-1
hoạt động , độc lập với biểu diễn dấu hiệu thực tế, trong khi đôi khi sẽ có hành vi đáng ngạc nhiên vì bạn sẽ phải có loại toán hạng phù hợp. Chỉ sau đó bạn sẽ nhận được giá trị cao nhất của một loại.~
unsigned
Để biết ví dụ về một bất ngờ có thể xảy ra, hãy xem xét điều này:
unsigned long a = ~0u;
Nó sẽ không nhất thiết lưu trữ một mẫu có tất cả các bit 1 vào a
. Nhưng trước tiên, nó sẽ tạo một mẫu có tất cả các bit 1 trong một unsigned int
, sau đó gán nó cho a
. Điều gì xảy ra khi unsigned long
có nhiều bit hơn là không phải tất cả trong số đó là 1.
Và xem xét cái này, cái này sẽ thất bại trên đại diện bổ sung không phải của hai:
unsigned int a = ~0; // Should have done ~0u !
Lý do cho điều đó là ~0
phải đảo ngược tất cả các bit. Đảo ngược sẽ mang lại -1
trên máy bổ sung hai (đó là giá trị chúng ta cần!), Nhưng sẽ không mang lại -1
đại diện khác. Trên máy bổ sung của một người, nó mang lại số không. Do đó, trên máy bổ trợ của một người, ở trên sẽ khởi tạo a
về không.
Điều bạn nên hiểu là tất cả về giá trị - không phải bit. Biến được khởi tạo với một giá trị . Nếu trong trình khởi tạo, bạn sửa đổi các bit của biến được sử dụng để khởi tạo, giá trị sẽ được tạo theo các bit đó. Giá trị bạn cần, để khởi tạoa
giá trị cao nhất có thể, là -1
hoặc UINT_MAX
. Thứ hai sẽ phụ thuộc vào loại a
- bạn sẽ cần sử dụng ULONG_MAX
cho một unsigned long
. Tuy nhiên, cách đầu tiên sẽ không phụ thuộc vào loại của nó và đó là một cách hay để nhận được giá trị cao nhất.
Chúng tôi không nói về việc -1
có tất cả các bit một hay không (không phải lúc nào cũng có). Và chúng ta không nói về việc ~0
có tất cả các bit một hay không (tất nhiên là có).
Nhưng những gì chúng ta đang nói là kết quả của flags
biến khởi tạo là gì. Và cho nó, chỉ-1
sẽ làm việc với mọi loại và máy.