[C++]Wartość wyrażenia

chinczykk
Użytkownik
Użytkownik
Posty: 31
Rejestracja: 17 kwie 2014, o 17:06
Płeć: Mężczyzna
Podziękował: 20 razy

[C++]Wartość wyrażenia

Post 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.
Ostatnio zmieniony 4 maja 2015, o 21:23 przez Dasio11, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++]Wartość wyrażenia

Post 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.
Awatar użytkownika
csminus
Użytkownik
Użytkownik
Posty: 45
Rejestracja: 29 lis 2014, o 13:06
Płeć: Mężczyzna
Lokalizacja: Lublin/Kraków/Warszawa
Pomógł: 3 razy

[C++]Wartość wyrażenia

Post 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.
ODPOWIEDZ