2011-06-28 11 views
6

Windows SDK ile derleyen bu kod var:Tüm bitleri 32 bit türünde ayarlamak için 0xFFFFFFFF güvenilir bir yol kullanıyor mu?

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

DragQueryFileW()'in bu imzası vardır:

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

ve UINT, SDK başlıklarında şu şekilde tanımlanmıştır:

typedef unsigned int UINT; 

int'nin kesinlikle 32-bit olduğu platform. Her zamanki gibi, UINT gibi türler sistem bitliği üzerinde sabit genişliğe sahip olacaklardır, bu yüzden aynı kodun başka bir platformda yeniden derlenmesi gerekiyorsa, DragQueryFileW()'un bir şekilde yeniden düzenlenmesi durumunda UINT haritasının üzerine UINT haritasına sahip olacak bir typedef olacaktır. uygun bir 32 bit işaretsiz tip.

Artık 0xFFFFFFFF sabitine bakarak statik bir analiz aracı var ve bunun tartışılmaz bir sihir numarası ve one should use -1 instead olduğunu düşünüyor. Elbette -1 iyi ve portatif iken 0xFFFFFFFF sabitinin nasıl kullanıldığını göremiyorum, çünkü bu tip bir portun taşınması bile 32-bit ve sabit olacak.

-1 yerine 0xFFFFFFFF kullanarak tüm bitleri güvenli ve taşınabilir bu senaryoda ayarlamak için mi?

+1

, statik analiz şikayet olabilir. – iammilind

+0

Statik analiz aracında yanlış bir pozitif gibi görünüyor. Bu sabiti her zaman 32-bit bir bağlamda kullandığınızı göremeyebilir. –

+4

Bunun yerine '~ 0u' kullanın. – ybungalobill

cevap

2

0xffffffff, tüm bitleri 32 bite bire ayarlamanın güvenilir bir yoludur. ama her zaman 32 bit olan bir UINT'ye bağlı kalmam.

daha az "sihirli" da yazabilirim yapmak: (1 < < 32) - 1

+0

Değişimin iyi bir fikir olup olmadığından emin değilim. -1'in kullanıldığı her yerde, teoride olduğu gibi, 2'lerin tamamlayıcısı olarak 1'lerin sonsuz bir akışıdır. – DarkDust

12

(bakılmaksızın tip boyutu) tüm bitlerini doldurmak için taşınabilir bir yolu gerçekten:

type variable = (type)-1; 

olduğu gibi:

UINT foo = (UINT)-1; 

veya daha taşınabilir kullanarak C99 tipi isimleri:

uint32_t foo = (uint32_t)-1; 

C standardı, -1'i atamanın tüm bitleri belirlediğini garanti eder.

Şimdi, değişkeninizin işaretsiz 32 bit olduğunu garanti ederseniz, 0xFFFFFFFF kullanarak, elbette, elbette. Ama ben hala -1 varyantı için giderdim.

+0

Hayır, bu, Standardın bunu yaptığı için işe yarar. Uygulamanın tamamlayıcısı olmayan bir platformda bile uygulama, çalışmasını garanti etmelidir. –

+0

@Luc Danton: Haklısınız. Bu arada bunu okuyun ve şimdi düzeltin. – DarkDust

3

0xFFFFFFFF ile karşılaştığım olası bir problem, bir F'yi kolayca özleyebileceğiniz ve tam bir kukla değerde başlatabileceğiniz bir sorun.

Ben bir sabit tanımlamak için iyi olduğuna inanıyoruz:

#define ALL_ONES_32BIT ((UINT) -1) 

ve her yerde bunu kullanın.

4

şunu kullanabilirsiniz: yaklaşık 32 bit veya 64-bit endişelenmeyin çünkü

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

Veya sadece 'tür var = ~ 0; – fredoverflow

+3

@FredOverflow, yapar mı? Ne tür int daha geniş ise? – Chethan

+0

İyi nokta! .... – fredoverflow

İlgili konular