2016-07-07 11 views
5

Napisałem prosty program w języku C i chciałem się dowiedzieć, czy w nim odbywa się promocja liczb całkowitych.Integer promotion in C program

Proszę wyjaśnić, w jaki sposób odbywa się promocja na liczbach całkowitych i jak tego uniknąć?

/* start of main */ 

unsigned short int res; 
unsigned short int bsp; 
signed short int analog; 

bsp = 2215; 
analog = 2213; 
if((signed short int)(bsp - analog) > 0){ 
    res = bsp - analog; 
    printf("%d", res); 
} 
else{ 
    res = analog - bsp; 
    printf("%d", res); 
} 
+1

Podpowiedź: 'printf ("% d ", res);' -> spójrz tam ... –

+0

@Ravi dla całkowitej promocji zobacz co powiedział Sourav, jednak mam wątpliwości: zamiast "promocji całkowitej" masz na myśli "zwykłą konwersję arytmetyczną"? –

+0

'bsp - analogowe' i ​​'analogowe - bsp' oba powodują promocję. – Sergio

Odpowiedz

2

zamierzam ograniczać tę odpowiedź do int jest 32 bit i 16 bit short bycia. Jest to wyrażenie typu int.

Zachowanie podczas rzutowania tego na short jest niezdefiniowane, jeśli bsp - analog nie może być reprezentowany w short. Dlatego należy ostrożnie pisać kod taki jak (signed short int)(bsp - analog).

Istnieje niejawna promocja res do int w twoim połączeniu printf.

Wreszcie najlepszym sposobem na uniknięcie niechcianych promocji jest praca z tym samym typem w całym tekście. Rozważ użycie w swoim przypadku modelu int lub long.

+0

NMDV, ale 'Wreszcie, aby ominąć niejawne promowanie res do int w twoim wywołaniu printf, użyj% hu jako formater." Prawdopodobnie nie jest właściwym słowem do użycia. –

+0

notice, "argument będzie został awansowany zgodnie z promocjami całkowitymi, ale jego wartość zostanie zmieniona na krótką int lub unsigned short int przed wydrukiem);" więc nigdy nie przestajesz promocji. –

+1

@Bathsheba Nie _ _ "zdefiniowana implementacja" _ zamiast _ "niezdefiniowane zachowanie" _? –

2

W promocjach całkowite wydawane są z dwóch różnych źródeł w programie:

  • zwykłe arytmetycznych konwersje (z powodu binarnym - operatora)
  • promocjach domyślne argumentów (z powodu printf funkcja variadic)

In bo W tych przypadkach argument o typie signed short int jest promowany do int, przyjmując, że zakres int może zawierać każdą liczbę, jaką może pomieścić poprzedni typ. Zwykle dzieje się tak, ponieważ short i int mają odpowiednio 16-bitową i 32-bitową szerokość.


1) Jako także > operatora (jak wspomniano w chux na comment poniżej).

+1

A niezwykła konwersja arytmetyczna_ występuje z powodu porównania '>' również. – chux