2016-02-03 21 views
5

Jakie są zasady używane przez C++ do określenia typu wyrażeń arytmetycznych obejmujących dwa różne typy liczb całkowitych?Reguły konwersji liczb całkowitych C++

Generalnie łatwo jest wypracować wynik, jednak natknąłem się na przypadki z podpisanymi/unsigned intami, które są mylące.

Na przykład oba poniższe elementy są wyświetlane pod numerem unsigned int w VS.

unsigned int us = 0; 
int s = 1; 

auto result0 = us - s; // unsigned int 
auto result1 = s - us; // unsigned int 

Czy to samo dotyczy innych kompilatorów? Czy istnieją jakieś szczególne zasady określania typu?

+2

Czy przeczytałeś [dokumentację] (http://en.cppreference.com/w/cpp/language/auto)? – NathanOliver

+0

Zasady są takie same, jak w przypadku odliczenia typu szablonu, z wyjątkiem przypadku 'auto x {wyrażenie};'/'auto x = {wyrażenie};'. – Michael

+6

To prawie wydaje się bardziej jak pytanie o promocję typu, a następnie o automatyczną dedukcję. – NathanOliver

Odpowiedz

5

Wszystko jest dobrze zdefiniowane.

1 jest podpisana . W rzeczywistości, jeśli chcesz go uzyskać, musisz użyć zapisu szesnastkowego lub ósemkowego, odpowiedniego sufiksu (na przykład u) lub rzutowania.

Jeżeli operacja arytmetyczna spotyka się, że ma signed int i unsigned int jako parametry, wtedy signed int jest przekształca do typu unsigned int.

+0

Wszystkie szczegóły konwersji całkowej zależą od typu miejsca docelowego, ale gdy jest to automatyczne, nie jest znane? –

+2

"Wszystkie szczegóły dotyczące konwersji całkowej zależą od typu celu". Absolutnie to ** nigdy ** przypadek. – Bathsheba

+0

http://pl.cppreference.com/w/cpp/language/implicit_cast#Integral_conversions –

0

Oto krótka, rought odpowiedź, mam nadzieję, że jest przydatna, mimo że nie obejmuje wszystko, a nawet może być uproszczeniem:

  1. Literówki są podpisane chyba że określono jako „U”.

  2. W wyrażeniach integralnych obejmujących różne typy, mniejsze typy całkowite są promowane (do int, jeśli wszystkie zainteresowane typy zmieszczą się w int, w przeciwnym razie promocja do unsigned int), czyli gdy nie podpisano i wartość oznaczona np. są dodawane, podpisana wartość jest "promowana" do unsigned int, jeśli niepodpisana zmienna ma tę samą szerokość bitową co int. Zatem niepodpisana int jest uważana przez kompilator za "większą" niż podpisana int w regułach promocji, nawet jeśli w czasie wykonywania rzeczywiste wartości przechowywane w zmiennych łatwo zmieściłyby się w podpisanej reprezentacji o tej samej liczbie bitów.

  3. Należy również zauważyć, że "znak" może oznaczać znak "unsigned char", natomiast "int" oznacza zawsze znak "int".

+0

3. Nie cała historia, char, unsigned char i signed char są 3 różnymi typami. Standard C gwarantuje, że wszyscy członkowie zestawu znaków podstawowego wykonania mają wartości nieujemne. Edytowanie odpowiedzi. –

Powiązane problemy