eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingKonwersja kodu › Re: Konwersja kodu
  • Data: 2015-09-26 18:22:13
    Temat: Re: Konwersja kodu
    Od: "M.M." <m...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On Saturday, September 26, 2015 at 5:27:32 PM UTC+2, szemrany wrote:
    > Hejka,
    >
    > Widzę, że niektórym się na grupie nudzi i próbują podkarmiać trolla, więc
    > może wykorzystam ten power w słusznym celu ;-)
    >
    > Mianowicie niejaki AK mnie porzucił z pomocą w konwersji kodu z C do
    > Pascala i potrzebuję pomocy.
    > Już prawie wszystko mam przetłumaczone, ale jeszcze pojawiają się
    > wątpliwości. Oto one.
    >
    > ret->allocated = (size / wordbitsize + 1);
    >
    > gdzie allocated to int
    >
    > Czy w C przypisanie wyniku dzielenia konwertuje/obcina go do typu
    > całkowitego?
    Pogooglaj za konwersją i promocją typów.
    http://mikrokontrolery.blogspot.com/2011/02/kurs-jez
    yka-c-rzutowanie-promocja-typow.html


    >
    > Kolejna rzecz.
    >
    > if (trailing_bits) {}
    >
    > gdzie trailing_bits to char
    >
    > Czy char jest odpowiednikiem typu byte z pascala?

    O ile pamiętam, to w C była gwarancja tylko co do tego:
    sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).

    Może gdzieś na jakiejś platformie przy jakiś opcjach char
    ma 10 bitów, moze gdzieś 16.

    Jeśli ilość bitów i bajtów w typach jest ważne, to najlepiej
    je przedefiniować w jakimś miejscu. Nastepnie na starcie
    programu:

    if( sizeof(moj_char) <= 2 ) {
    printf("ten program zadziała tylko na znakach 2bajtowych");
    abort();
    }




    > Czy takie sprawdzanie warunku to sprawdzenie czy trailing_bits <> 0?
    Tak.



    > I następna.
    >
    > x = (word_t) ~0;
    >
    > gdzie word_t to uint64
    >
    > Czy to jest równoważne zapisowi:
    >
    > x = max_uint64;
    Zależy czym jest to zero bez sufixów.
    Ja bym napisał , że:
    x = ~0ULL;
    jest równe
    x = max_uint64;


    > czyli zapalone wszystkie 64 bity?


    > Kolejny niejasny moment:
    >
    > ret->trailing_bits = *(ret->bitset + ret->allocated - 1) ? (word_t) ~0 : 0;
    Faktycznie niejasny moment. Nie lepiej unikać takich sytuacji?
    Dlaczego nie sprawdzisz jak Twój kompilator na Twojej platformie z Twoim
    opcjami się zachowa?

    Na pewno
    typ_calkowity x = 0;
    wyzeruje wszystkie bity

    Ustawia się wszystkie bity tak:
    typ_dodatni x = ~((typ_dodatni)0);

    Wyrażenie
    ~0
    jest równe -1. Co się stanie gdy wartość ujemną się przypisze do
    typu dodatniego? Odpowiadam pytaniem, po co coś takiego robić?
    Chcesz wiedzieć jak się zachowa kompilator, a czy w ogóle można
    sensownie się zachować, gdy ktoś każe trzymać wartość ujemną w
    typie bez znaku?

    I odwrotnie:
    ~0u
    to max_uint.
    Przypisywanie max_uint do inta to przekroczenie zakresu. Znowu moje
    pytanie, po co coś takiego robić? Nie lepiej napisać kod tak, aby z
    niego wynikały intencje programisty? Np.:
    int x = -1;

    Mieszanie operacji arytmetycznych ze znakiem z operacjami bitowymi to
    proszenie się o kłopoty. Wiem, można uzyskać szybszy kod. Można nawet w
    typie double ustawiać i zerować bity. Ale



    >
    > Co ta linia przypisuje do trailing_bits?
    >
    > I definicje, żeby było łatwiej:
    >
    > ret to IntBitSet
    >
    > typedef unsigned long long int word_t;
    >
    > typedef struct {
    > int size;
    > int allocated;
    > word_t trailing_bits;
    > int tot;
    > word_t *bitset;
    > IntBitSet;
    >
    > Dziękuję :-)

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: