C Standardı (C90, Derek Jones'un açıklamalı C99 kitabında çalışıyorum) çalışıp çalışmadığımı anlamaya çalışıyorum, iki işaretsiz 8 bitlik değerin çarpımını ve 16 sonuç. şöyle bir örnek ifadedir:C: 8x8 -> 16 bit çarpma hassasiyeti tamsayı promosyonlar tarafından garanti ediliyor mu?
unsigned char foo;
unsigned int foo_u16 = foo * 10;
Bizim Keil 8051 derleyici (şu anda v7.50) B siciline MSB depolar ve LSB akümülatör bir MUL AB talimat üretecektir. Önce bir imzasız int için foo döküm edin:
unsigned int foo_u16 = (unsigned int)foo * 10;
sonra derleyici doğru orada bir imzasız int istiyorum karar verir ve 16x16 bit tamsayı çarpma rutin pahalı bir çağrı oluşturur. Bu savunma önleminin gerekli olmadığı konusunda makul şüphenin ötesinde tartışmak istiyorum. 6.3.1.1'de tarif edilen tamsayı terfilerini okurken, ilk satırın etkisi foo ve 10 imzasız int'e terfi ettirilir, çarpım gerçekleştirilir ve sonuç foo_u16'da imzasız int olarak depolanır. Derleyici, hassasiyet kaybı olmadan 8x8-> 16 bit çoğalmaları yapan bir talimatı bilirse, o kadar iyi; ancak hassasiyet garantilidir. Bunu doğru okuyor muyum?
Saygılarımızla, Craig Blome
"UCHAR_MAX" 3277'den daha az olduğu sürece (ve OP'nin sorusu 'char' 8 bit olduğunu gösterir, bu yüzden doğrudur), sonuç kesinlikle 'imzalı int'e sığacaktır ve sonuçta sonuç olmalıdır. aynısı. – caf
Ayrıca, "imzasız int" işlenenlerinde çoğaltmanın yapılmasının alternatif bir yolu da, sabitin "10U" olarak belirtilmesidir. – caf
@caf: Evet, haklısın. Kavramsal farklılık olsa da, sonuç taşmamalı. – AnT