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 longcó 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à ~0phải đảo ngược tất cả các bit. Đảo ngược sẽ mang lại -1trê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 avề 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à -1hoặc UINT_MAX. Thứ hai sẽ phụ thuộc vào loại a- bạn sẽ cần sử dụng ULONG_MAXcho 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 -1có 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 ~0có 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 flagsbiế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.