Article View: pl.comp.lang.c
Article #1046Re: Operacje na bitach
From: Adam Jancewicz
Date: Fri, 30 Jan 1998 17:25
Date: Fri, 30 Jan 1998 17:25
102 lines
3977 bytes
3977 bytes
Karpierz wrote:
>
> Adam Jancewicz <adash@obop.com.pl> napisal
> Karpierz wrote:
> >
> > Marek Kotowski <mkot@imm.org.pl> napisal
> > > Karpierz wrote (w watku "Rezerwacja pamieci"):
> [...]
> > > > typedef unsigned int uint; // taka moja fanaberia
> > >
> > > > int a = ~0; // lub dowolna wartosc ujemna
> > > > uint b = ~0; //
> > >
> > > ....
> > >
> > > > printf ("\n%ld %ld", (long) a, (long) b);
> > >
> > > > Wydaje sie ze powinno to dac identyczne dwie wartosci,
> > > > prawda ?
> > >
> > > Nie wydaje sie. :-)
> >
> > Nie zgodze sie :). Sa dwie rozne wartosci, ale _wydaje_ sie
> > (przynajmniej mnie), ze powinny byc identyczne.
>
> >I są identyczne, w środowiku w którym pracuję sizeof(long) ==
> >sizeof(int) :)
>
> Wlasnie, to jeszcze jeden kwiatek do korzucha w C.
> Raz sa rowne a raz nie....
>
C nie gwarantuje przecierz rozmiaru np. inta.
Problem występuje przy zmianie reprenacji (liczby bitów)
rzutowanego typu. Przy jednakowym rozmiaże rzutowanie
to tylko rzecz interpretacji ciągu bitów.
BTW Co to jest korzuch (korzucha) ?)
> [...]
>
> > 1. (long)a - a jest signed, więc bit znaku jest propagowany na
> > starsze słowo, a a jest kopiowane do młodszego
>
> >2. (long)b - b jest kopiowane do młodszego słowa.
>
> to jest dla mnie jasne
>
> >3. (unsigned long)a - z moich doświadczeń wynika, że jest
> > równoważne (unsigned long)(long)a.
>
> Wlasnie, to jest ten problem o ktorym mowilem.
> Wiem ze tak jest. Chociaz trudno sie chyba zgodzic, ze
> zapis (unsigned long) to sugeruje, raczej wprost przeciwnie :(.
> Czyli faktycznie o propagacji znaku decyduje nie typ na ktory
> rzutujemy ale typ wartosci rzutowanej, ale czy zawsze czy tylko
> w przypadku wartosci long i int:
> Czy podobna zasada obowiazuje rowniez dla innych typow
> calkowitych ?
Przy innych też, ja to sprawdzałem na (long)char itp.
> Wydaje sie ze tak ale czy mozna byc na 100% pewnym, i czy
> jest to gdzies wyraznie napisane ?.
>
> >Sam jestem ciekawy czy jakiś standard to precyzuje (zwłaszcza punt 3.).
>
> Ja tez. Dokladnie o ten przypadek mi chodzi.
> Dla C++ jest to troche dokladniej okreslone (promocja calkowita to sie
> nazywa).
> Ale dla K&R C jest wyrazna luka i dlatego pytalem poprzednio jak to
> precyzuje standard.
Podejrzewam że nic tego nie precyzuje.
Konwersja signed char (bajt) na int (2 bajty) była/jest
realizowana na Intelach poprzez instrukcję CBW (convert byte to word)
procesora, która działa właśnie tak, że powiela bit znaku na starszy
bajt.
natomiast w przypadku typu unsigned jest realizowana inaczej. Myśle, że
na innych architeturach jest podobnie.
Nie wiem jak to jest w przypadku dłuższych typów, ale skutek jest
analogiczny.
> Szczegolnie chodzi mi o przypadek.
>
> (long) a i (unsigned long) a
>
> gdzie a jest typu short lub unsigned short i char i unsigned char
>
> /przy zalozeniu ze sizeof(long) > sizeof (int) > sizeof (short)/
>
Uważam, że zasada jest taka że rzut jest realizowany tylko
ze względu na typ elementu rzutowanego. I potem interpretowany
jako signed lub unsigned. To chyba jedyny sensowny sposób.
Adam
--
Adam Jancewicz
mailto: adash@obop.com.pl
Technical Details
Message-ID:
<34D20D01.58091539@obop.com.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.pse.pl!zwieracz!not-for-mailReferences:
<34D0605D.5843@imm.org.pl> <01bd2caf$70afa4a0$8cbaccc2@karpierz.dyn.ml.org> <34D0BBCF.ADA1488D@obop.com.pl> <01bd2ce4$bb394460$8ebaccc2@karpierz.dyn.ml.org>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.pse.pl!zwieracz!not-for-mail From: Adam Jancewicz <adash@obop.com.pl> Newsgroups: pl.comp.lang.c Subject: Re: Operacje na bitach Date: Fri, 30 Jan 1998 18:25:21 +0100 Organization: OBOP Lines: 132 Message-ID: <34D20D01.58091539@obop.com.pl> References: <34D0605D.5843@imm.org.pl> <01bd2caf$70afa4a0$8cbaccc2@karpierz.dyn.ml.org> <34D0BBCF.ADA1488D@obop.com.pl> <01bd2ce4$bb394460$8ebaccc2@karpierz.dyn.ml.org> NNTP-Posting-Host: hq.obop.com.pl Mime-Version: 1.0 X-Mailer: Mozilla 4.04 [en] (X11; I; Linux 2.0.32 i586) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit