Strona 1 z 1
[C++]Wartość wyrażenia
: 4 maja 2015, o 19:38
autor: chinczykk
Mam takie zadanie. Zbytnio go nie rozumiem. Ile wynosi wartość wyrażenia: 0x1c/010 i dlaczego nie 3.5? Które z poprawek: a) (double)(0x1c/010) b) (double)0x1c/010 c) 1.0*0x1c/010 d) 0x1c/010*1.0 pozwolą uzyskać dokładny wynik i dlaczego/dlaczego nie? *
Wychodzi mi z 0x1c/010 że to 14 . Chyba w ogóle źle to rozumuje.
[C++]Wartość wyrażenia
: 4 maja 2015, o 19:58
autor: Althorion
Licznik jest w systemie szesnastkowym (bo zaczyna się od 0x), licznik w ósemkowym (bo zaczyna się od 0). Tak więc \(\displaystyle{ \frac{\text{0x1c}}{010} = \frac{28}{8} = 3{,}5}\).
Myślałeś pewnie, że ta druga liczba jest zapisana w systemie binarnym. Otóż nie, by móc zapisywać w systemie dwójkowym trzeba pisać co najmniej w standardzie C++14 i użyć prefiksu 0b.
[C++]Wartość wyrażenia
: 4 maja 2015, o 22:25
autor: csminus
C/C++ nie posiada 2 operatorów dzielenia - dzielenia całkowitego oraz dzielenia rzeczywistego(z resztą), aby wynik był liczbą rzeczywistą co najmniej jeden z liczb musi być rzeczywista.
kompilator liczbę zapisaną w ten sposób uzna za całkowitą.
teraz już za rzeczywistą
Kod: Zaznacz cały
//rzutowanie wykonujemy już po dzieleniu,
//więc wynikiem będzie 3 - źle
std::cout << (double)(0x1c/010) << "
";
//wykonujemy rzutowanie na pierwszej liczbie przed dzieleniem,
//teraz pierwsza liczba jest rzeczywista więc wynik się zgadza
std::cout << (double)0x1c/010 << "
";
//pierwsza liczba jest mnożona przez rzeczywiste 1,
//przez co staje się rzeczywista - wynik się zgadza
std::cout << 1.0*0x1c/010 << "
";
//wynik dzielenia jest mnożony przez rzeczywistą jedynkę,
//3 - źle
std::cout << 0x1c/010*1.0 << "
";
O zapisie liczb w innych systemach wiesz od kolegi wyżej.