2010-04-22 16 views
5

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

cevap

5

promosyon garanti, ancak unsigned char aralığı signed int aralığında uygun olması durumunda promosyon signed int tipine yapılır. ne görünüşte istediğiniz olabilir çarpma sonucu

unsigned int foo_u16 = (unsigned) foo * 10; 

iken Yani bakış dil açısından (sığacağı varsayarak) senin

unsigned int foo_u16 = foo * 10; 

unsigned int foo_u16 = (signed) foo * 10; 

eşdeğerdir Farklıysa (sonuç) signed int aralığına uymuyorsa. senin derleyici farklı şekilde yorumlaması,

, derleyici bir hata olabilir (yine varsayımı altında unsigned char o aralık signed int aralığında sığar).

+1

"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

+0

Ayrıca, "imzasız int" işlenenlerinde çoğaltmanın yapılmasının alternatif bir yolu da, sabitin "10U" olarak belirtilmesidir. – caf

+0

@caf: Evet, haklısın. Kavramsal farklılık olsa da, sonuç taşmamalı. – AnT

İlgili konular