Article View: pl.comp.lang.c
Article #1045Re: Operacje na bitach
From: Karpierz
Date: Thu, 29 Jan 1998 18:35
Date: Thu, 29 Jan 1998 18:35
70 lines
2850 bytes
2850 bytes
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....
[...]
> 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 ?
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.
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)/
-----
Pozdrawiam (rowniez)
Adam (rowniez)
Technical Details
Message-ID:
<01bd2ce4$bb394460$8ebaccc2@karpierz.dyn.ml.org>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.nask.pl!ict.pwr.wroc.pl!not-for-mailReferences:
<34D0605D.5843@imm.org.pl> <01bd2caf$70afa4a0$8cbaccc2@karpierz.dyn.ml.org> <34D0BBCF.ADA1488D@obop.com.pl>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.nask.pl!ict.pwr.wroc.pl!not-for-mail From: "Karpierz" <karpierz@inter.intertele.pl> Newsgroups: pl.comp.lang.c Subject: Re: Operacje na bitach Date: 29 Jan 1998 18:35:29 GMT Organization: Technical University of Wroclaw, Poland Lines: 72 Message-ID: <01bd2ce4$bb394460$8ebaccc2@karpierz.dyn.ml.org> References: <34D0605D.5843@imm.org.pl> <01bd2caf$70afa4a0$8cbaccc2@karpierz.dyn.ml.org> <34D0BBCF.ADA1488D@obop.com.pl> NNTP-Posting-Host: ppp142.intertele.pl X-Newsreader: Microsoft Internet News 4.70.1161 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit