2010-11-16 23 views
11
while ((1U << i) < nSize) { 
     i++; 
    } 

1U yerine 1 kullanmak için herhangi bir sebep var mı?c de 1U ile 1 arasında bir fark var mı?

+0

Bu kod dosyası [içinde, php'nin kaynak kodunda görünüyorsa zend_hash.c] (https://github.com/php/php-src/blob/02457554a35fbb96fd3f51caf7deab91ca32ecb2/Zend/zend_hash.c#L154-L156). –

cevap

13

Çoğu compliers'da her ikisi de aynı gösterimle sonuç verecektir. Bununla birlikte, C belirtimine göre, imzalı bir argüman üzerinde bir bit vardiyası işleminin sonucu uygulama tanımlı sonuçlar verir, bu nedenle 1U << i1 << i'dan daha taşınabilirdir. Pratikte, imzalı sol tedaviyle karşılaşacağınız tüm C derleyicileri imzasız sol vardiyalarla aynıdır.

Diğer bir nedense, nSize imzasız ise, imzalı bir 1 << i ile karşılaştırılması, bir derleyici uyarısı oluşturacaktır. 1U için 1 uyarı mesajının kurtulur ve i derleyici uyarısı büyük olasılıkla 1U kodda göründüğü nedeni budur 31 veya 63.

ise ne olduğu hakkında endişelenmenize gerek yok Değiştirme. Çoğu uyarı açıkken C'yi derlemenizi ve kodunuzu değiştirerek uyarı mesajlarını kaldırmanızı öneririm.

+1

'1 << Uygulama tanımlı değil. Değer, INT_MAX değerini aşmadığı ve * tanımlanmamış davranış * taşma yaparsa (işaret bitine) iyi tanımlanmıştır. –

+0

Üzgünüm, haklısın (çoğunlukla). Sonucu yalnızca sonuç türünde temsil edilemezse tanımlanmaz (standart, işaret bitlerinden bahsetmez, ancak herkes bugün ikişer tamamlayıcısı kullandığı için bu gerçekleşir). –

5

1U imzasız. Değerleri iki kat büyük, ancak negatif değerler olmadan taşıyabilir.

Çevreye bağlı olarak, U kullanırken, taşmaya neden olmadan en fazla 31 veya 15 olabilir. U kullanmadan, i 30 32 bit int
15 içindir, 30 ya da

31 14 bir maksimum olabilir, 14

+0

Ama bir sabit olarak, 1 ve 1U aynı şey, değil mi? – arr

+0

no. 1 int, 1U imzasız int. – AlexanderMP

+0

En azından 1U << i' bağlamında, aynı, değil mi? – arr

1

1U işaretsiz 16 bit int içindir.

İçinde imzasız bir değer kullanmış olmasının nedeni, (sanırım) nSize işaretsiz olduğundan ve derleyiciler (belirli parametrelerle çağrıldığında) imzalı ve imzasız değerleri karşılaştırırken uyarılar vermesidir.

Başka bir sebep (benim düşüncemde, ama bilmeyerek bilmemizdir, ama bilmeyiz, wath değerini bilmeden nSize varsaymak gerekir) bu imzasız değerler iki kat daha büyük olabilir, bu yüzden nSize olabilir ~ 4 * ~ 2 * 10^9 yerine 10^9.

3

nSize bir int ise, en fazla 2147483647 (2^31-1) olabilir. yerine 1U ait 1 kullanırsanız o zaman 1 << 30 size 1073741824 alacak ve 1 << 31 -2147483648 olacak ve böylece while döngüsü nBoyut 2147483648 değerlendirecek 1U << i ile daha büyük 1073741824.

, 1U << 31 ise hiç bitmeyecek ve böylece nSize için 2147483647'ye kadar güvenle kullanabilirsiniz. Eğer nSize bir imzasız int ise, bu durumda nSize 1U << 31'dan daha büyük olabilir.

Düzenleme: Yani cevaplar nBoyut imzasız olması gerektiğini bildiren katılmıyorum, ancak daha sonra imzalanmış ise negatif olmamalı ...

İlgili konular