2017-11-01 414 views
7

Negatif numarada bitsel bir sola kaydırma işlemi yapıyorum. Uyarı değişken kullanıldığında değişmez tamsayı kayması kullanılan ve değilken kodunun üzerinde derleme geliyor nedenNeden bir negatif değeri değişmez ile değiştirerek [-Wshift-negatif-değeri] uyarısı veriyor

int main(void) { 
    int count = 2; 
    printf("%d\n", ~0<<count); 
    printf("%d\n", ~0<<2); // warning:shifting a negative signed value is undefined [-Wshift-negative-value] 
    return 0; 
} 

Benim şüphe.

+2

Sanırım "~ 0 << 2" nin neden uyarıya yol açtığını soruyor, ancak '~ 0 << sayımı' değil. –

+1

@ChristianGibbons Evet, anladım. Biraz fazla geç –

+2

Muhtemelen 'say' '0 'olabilir –

cevap

2

C89 altında, negatif değerlerin sol geçişlerini bu platformlarda en mantıklı olmayan yollarla işlemek için olanlar 'tamamlayıcı ve işaret büyüklüğü uygulamaları gerekiyordu. Örneğin, bir 'tamamlayıcı platformunda, C89 -1 olarak < < 1 -3 olarak tanımlanmıştır. Standardın yazarları, derleyici yazarların, negatif sayıların sol vardiyalarını uygun gördükleri şekilde ele almalarına izin vererek bu sorunu düzeltmeye karar verdiler. İki tamamlayıcıyı içeren tüm uygulamalarda esnekliğin, C89 davranışından sapmak için iki tamamlayıcı uygulamanın amaçlandığını ima etmek için kullanılmamasına izin verilmemesi gerektiği. Çok daha muhtemel olan, iki tamamlayıcı platformlardaki mantıklı davranışların derleyici yazarların bir yetkiyle birlikte veya o olmadan anlayacağı konusunda yeterince açık olmasını beklediler ve beklediler.

Derleyiciler çoğunlukla yaklaşık uyarısı ile sola kaydırır x<<y hem x ve y sabitleri olduğunda basitleştirilebilir, ancak bu sadeleştirme kayması içeren kod olup olmadığını derleme zamanında de kayma gerçekleştirmek gerektirecektir, çünkü diğer kontrol negatif sabitleri çalıştırıldı. Buna karşılık, someConstant << nonConstant verilen, basitleştirme genellikle mümkün olmaz ve bu nedenle derleyici basitçe çalışma zamanında vardiya yapan bir kod üretecekti.