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.