2011-06-28 68 views
6

Có mã này mà biên dịch với Windows SDK:Có sử dụng 0xFFFFFFFF một cách đáng tin cậy để thiết lập tất cả các bit trong một loại 32-bit?

UINT cFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0); 

nơi DragQueryFileW() có chữ ký này:

UINT DragQueryFileW(HDROP, UINT, LPWSTR, UINT); 

UINT được định nghĩa ở đâu đó trong tiêu đề SDK như thế này:

typedef unsigned int UINT; 

cho nền tảng nơi int chắc chắn là 32 bit. Như thường lệ, các kiểu như UINT có nghĩa là có chiều rộng cố định độc lập trên bit hệ thống, vì vậy nếu mã tương tự phải được biên dịch lại trên một số nền tảng khác, trong đó DragQueryFileW() được thực hiện lại bằng cách nào đó cũng sẽ có typedef tương ứng sẽ tạo bản đồ UINT một loại không dấu 32 bit phù hợp.

Bây giờ, có một công cụ phân tích tĩnh nhìn vào hằng số 0xFFFFFFFF và phàn nàn rằng đó là số ma thuật không thể chuyển đổi và one should use -1 instead. Trong khi tất nhiên -1 là tốt và di động Tôi không thể thấy cách sử dụng hằng số 0xFFFFFFFF có thể là một vấn đề ở đây vì ngay cả khi việc chuyển loại vẫn sẽ là 32-bit và hằng số sẽ ổn.

Đang sử dụng 0xFFFFFFFF thay vì -1 để đặt tất cả các bit an toàn và di động trong trường hợp này?

+1

Có thể phân tích tĩnh phàn nàn, bởi vì nó có thể không lo lắng về việc 32-bit hoặc 64-bit. – iammilind

+0

Âm thanh như dương tính giả trong công cụ phân tích tĩnh. Có thể không thấy rằng bạn luôn sử dụng hằng số đó trong ngữ cảnh 32 bit. –

+4

Sử dụng '~ 0u' để thay thế. – ybungalobill

Trả lời

2

0xffffffff chắc chắn là một cách đáng tin cậy để đặt tất cả bit thành một bit trong 32 bit. nhưng tôi sẽ không phụ thuộc vào UINT luôn là 32 bit.

để làm cho nó ít "ma thuật" bạn cũng có thể viết nó: (1 < < 32) - 1

+0

Tôi không chắc chắn liệu việc chuyển dịch có phải là một ý tưởng hay hay không. Sử dụng -1 làm việc ở khắp mọi nơi, như trong lý thuyết, nó là một dòng vô tận của 1s trong bổ sung của 2. – DarkDust

12

Cách cầm tay để điền vào tất cả các bit (không phân biệt loại kích thước) thực sự là:

type variable = (type)-1; 

như trong:

UINT foo = (UINT)-1; 

trở lên di động sử dụng tên loại C99:

uint32_t foo = (uint32_t)-1; 

Chuẩn C đảm bảo rằng gán -1 đặt tất cả các bit.

Bây giờ, nếu bạn có thể đảm bảo rằng biến của mình là không được ký 32 bit thì tất nhiên, sử dụng 0xFFFFFFFF cũng không sao. Nhưng tôi vẫn đi cho phiên bản -1.

+0

Không, điều này làm việc vì tiêu chuẩn làm cho nó như vậy. Ngay cả trên một nền tảng mà không sử dụng bổ sung của hai việc thực hiện có để đảm bảo nó hoạt động. –

+0

@Luc Danton: Bạn nói đúng. Đọc rằng trong thời gian chờ đợi và bây giờ đã sửa chữa nó. – DarkDust

3

Một vấn đề tiềm năng mà tôi thấy với 0xFFFFFFFF là bạn có thể dễ dàng bỏ lỡ một F và khởi tạo một giá trị giả hoàn chỉnh.

Tôi tin rằng nó là tốt hơn để xác định một hằng số:

#define ALL_ONES_32BIT ((UINT) -1) 

và sử dụng ở khắp mọi nơi.

4

bạn có thể sử dụng:

type var = 0; 
var = ~var; 
+0

Hoặc chỉ cần 'loại var = ~ 0;' – fredoverflow

+3

@FredOverflow, điều đó sẽ làm gì? Nếu loại rộng hơn int thì sao? – Chethan

+0

Điểm tốt! .... – fredoverflow