Aracılığıyla paylaş


Olağan Aritmetik Dönüştürmeler

Çoğu C işleci, bir ifadenin işlenenlerini ortak bir türe getirmek veya kısa değerleri makine işlemlerinde kullanılan tamsayı boyutuna genişletmek için tür dönüştürmeleri gerçekleştirir. C işleçleri tarafından gerçekleştirilen dönüştürmeler, belirli işleç ve işlenen veya işlenen türüne bağlıdır. Ancak, birçok işleç integral ve kayan türlerin işlenenleri üzerinde benzer dönüştürmeler gerçekleştirir. Bu dönüştürmeler "aritmetik dönüştürmeler" olarak bilinir. İşlenen değerin uyumlu bir türe dönüştürülmesi, değerinde hiçbir değişikliğe neden olmaz.

Aşağıda özetlenen aritmetik dönüştürmelere "normal aritmetik dönüştürmeler" adı verilir. Bu adımlar yalnızca aritmetik tür bekleyen ikili işleçler için uygulanır. Amaç, aynı zamanda sonucun türü olan ortak bir tür vermektir. Gerçekte hangi dönüştürmelerin gerçekleştiğini belirlemek için derleyici, ifadedeki ikili işlemlere aşağıdaki algoritmayı uygular. Aşağıdaki adımlar öncelik sırası değildir.

  1. İşlenenlerden biri türündeyse long double, diğer işlenen türüne long doubledönüştürülür.

  2. Yukarıdaki koşul karşılanmazsa ve işlenenlerden herhangi biri türündeyse double, diğer işlenen türüne doubledönüştürülür.

  3. Yukarıdaki iki koşul karşılanmazsa ve işlenenlerden herhangi biri türündeyse float, diğer işlenen türüne floatdönüştürülür.

  4. Yukarıdaki üç koşul karşılanmazsa (işlenenlerin hiçbiri kayan türde değilse), işlenenlerde tam sayı dönüştürmeleri aşağıdaki gibi gerçekleştirilir:

    • İşlenenlerden biri türündeyse unsigned long, diğer işlenen türüne unsigned longdönüştürülür.

    • Yukarıdaki koşul karşılanmazsa ve işlenenlerden ikisi de türündeyse long , unsigned inther iki işlenen de türüne unsigned longdönüştürülür.

    • Yukarıdaki iki koşul karşılanmazsa ve işlenenlerden biri türündeyse long, diğer işlenen türüne longdönüştürülür.

    • Yukarıdaki üç koşul karşılanmazsa ve işlenenlerden biri türündeyse unsigned int, diğer işlenen türüne unsigned intdönüştürülür.

    • Yukarıdaki koşullardan hiçbiri karşılanmazsa, her iki işlenen de türüne intdönüştürülür.

Aşağıdaki kodda bu dönüştürme kuralları gösterilmektedir:

float   fVal;
double  dVal;
int   iVal;
unsigned long ulVal;

dVal = iVal * ulVal; /* iVal converted to unsigned long
                      * Uses step 4.
                      * Result of multiplication converted to double
                      */
dVal = ulVal + fVal; /* ulVal converted to float
                      * Uses step 3.
                      * Result of addition converted to double
                      */

Ayrıca bkz.

C İşleçleri