Wpis z mikrobloga

@jaksa0: Binarnie. Tak samo masz pojedynczą i podwójną precyzję w liczbach zmiennoprzecinkowych. Wiadomo że nie da się dokładnie zapisać liczby zmiennoprzecinkowej. Masz mantysę gdzie się przechowuje liczbę po przecinku i cechę czyli wykładnik. Więc mam test zapisany we floacie a w wynik wpisuję zdereferowany adres pamięci czyli to co się pod nim znajduje. Mnie zastanawia dlaczego konwersja na (int*) czyli wskaźnik na inta daje taką dziwną wartość skoro wynikTestu jest intem,
@Dalegor_: Znaczy ja mniej więcej wiedziałem jak (T*)działa, tylko jakoś nigdy w mojej historii programowania nie miałem okazji konwertować tak z float& do int* i chyba mnie to zaskoczyło aż za bardzo. Poniekąd żałuję że tutaj napisałem bo zamiast wyjaśnić sprawę to dostałem odpowiedź żebym się o kodzie binarnym uczył :D Mimo wszystko dzięki za poświęcony trud.

Edit: może jednak nie wiedziałem skoro zaskoczeniem także było int wynikTestu = *(float*)&test
Edit: może jednak nie wiedziałem skoro zaskoczeniem także było int wynikTestu = *(float*)&test że działa poprawnie :D


@przemyslaw-maczka: Tutaj już zasługa kompilatora za implicit conversion. W tym przypadku kompilator stara się przekonwertować floata na inta w miarę bezstratnie i o dziwo bezpośrednio za pomocą instrukcji procesora (w moim przypadku CVTTSS2SI, sam sposób konwersji może się różnić). Masz tutaj picrel jak to działa w kodzie assembly.

Pobierz
źródło: comment_1659988659g0eO7W2kpaJOnSeHypBNfW.jpg
@przemyslaw-maczka: i dobrze, że nie miałeś okazji. Fajnie jest raz czy dwa to zobaczyć i przekonać się jak są przechowywane dane w komputerze, ale w kodzie produkcyjnym rzutowanie wskaźników to źródło potencjalnych trudnych do znalezienia błędów. Szczególnie w c++, gdzie w ogóle powinno się w miarę możliwości unikać gołych wskaźników.