Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 11 odgovora
  • 4.150 pregleda

Najnovija ↓

Jel ovo greska u kompajleru ? 03.03.2004. u 23:44 · pre 276 meseci #1
Zasto mi x =0xFFFFFFFF & 0x80000000 vraca nulu ?
x je unsigned short al' mislim da to nema veze, probao sam i sa unsigned int.

Koristim MS Visual C++ 5.0
Potpis
Mali Oglasi
Re: Jel ovo greska u kompajleru ? 03.03.2004. u 23:55 · pre 276 meseci #2
Za "unsigned short" je normalno, jer ti kompajler odseca dva visha bajta i ostavlja nizhe koji su nula.
ALI za unsigned int ne sme da bude 0! Nemam VS5, tako da ne mogu da tvrdim da li je bug, ali na novijim je sve u redu
Re: Jel ovo greska u kompajleru ? 03.03.2004. u 23:58 · pre 276 meseci #3
probaj sa long int
koliko ja znam unsigned int range je 0-FFFF
Re: Jel ovo greska u kompajleru ? 03.03.2004. u 23:59 · pre 276 meseci #4
Evo šta kaže GCC:

Code:
#include stdio.h
 
 int main() {
     unsigned short i = 0xFFFFFFFF  0x80000000;
 
     printf("%dn", i);
     return 0;
 }

a kompajliranje:
Code:
/home/filip/work/prg/c/
 gcc -o bitwise bitwise.c
 bitwise.c: In function `main':
 bitwise.c:4: warning: large integer implicitly truncated to unsigned type
 
 Compilation finished at Wed Mar  3 23:54:09
 

Inače, pokrenut program i kod mene vraća nulu.

f

Re: Jel ovo greska u kompajleru ? 04.03.2004. u 01:23 · pre 276 meseci #5
To upravo tako treba i da bude. Evo zasto:

unsigned short x = 0xFFFFF & 0x80000;

je isto sto i:

unsigned short x = (unsigned short) 0x80000; // zanemarimo warning

a to je isto sto i:

unsigned short x = 0x0000;

zato sto kada 0x80000 prebacis u short, ti u stvari uzimas njegovih donjih 16 bita, a to je 0.
Re: Jel ovo greska u kompajleru ? 04.03.2004. u 11:00 · pre 276 meseci #6
Ok, probao sam sve kombinacije opet nista...
kad stavim x - unsigned int ili long
onda mi rezultat bude 2147483648 ?!

U sustini ovo radim jer raspakujem bit po bit 32bit integer, e ova brojka se dobije svuda umesto jedinice ! Nule funkcionisu ali kecevi su "predstavljeni" ovom brojkom.
Npr. niz za devetku bi bio : ( LSB 4 bita )

2147483648
0
0
2147483648


mogu da jednostavno zamenim ovo kecevima i voila, ali me i zanima sto se zaglupljuje ....
Potpis
Mali Oglasi
Re: Jel ovo greska u kompajleru ? 04.03.2004. u 11:06 · pre 276 meseci #7
"ivan@elfak" wrote:
Citat:
onda mi rezultat bude 2147483648 ?!

U sustini ovo radim jer raspakujem bit po bit 32bit integer, e ova brojka se dobije svuda umesto jedinice ! Nule
Rezultat i treba da bude 2147483648. 0xffffffff / 0x80000000 = 0x80000000 = 2147483648.

Da li možeš da nam pošalješ minimalan primer koda, i da kažeš: evo, ovde program ispisuje to-i-to, a ja mislim da treba da ispiše to2-i-to2?

f

Re: Jel ovo greska u kompajleru ? 04.03.2004. u 11:30 · pre 276 meseci #8
Ups, izvini, nisam se setio da pogledam binarni ekvivalent broju 2147483648 ...

Sada je sve u redu. Funkcionise.

inace samo sam hteo da raspakujem int prostom petljom
Code:

for(i=0;i<32;i++)
{
printf("%d", (broj & 0x80000000) != 0)
broj<<=1;
}

medjutim izgleda se malo zbunio, pa sam posle u debugeru gledao rezultat onog "&" i kad sam promenio short u int u debugeru dobih onaj broj i zaboravio sam na "!=0"
sto je davalo ispravan rezultat.

Sve u svemu hvala, reseno je !
Potpis
Mali Oglasi
Re: Jel ovo greska u kompajleru ? 04.03.2004. u 12:02 · pre 276 meseci #9
Uzgred, verovatno je bolja ideja da bitove vadiš iz unsigned broja počev od bita najmanje težine. Onda ti program ne zavisi od stvarne dužine tipa int u bitovima.

f

Re: Jel ovo greska u kompajleru ? 05.03.2004. u 14:28 · pre 276 meseci #10
Citat:
filmil:
Uzgred, verovatno je bolja ideja da bitove vadiš iz unsigned broja počev od bita najmanje težine. Onda ti program ne zavisi od stvarne dužine tipa int u bitovima.

Ok, broj i jeste unsigned, al ne kontam dokle mi ide petlja ?
Potpis
Mali Oglasi
Re: Jel ovo greska u kompajleru ? 05.03.2004. u 14:44 · pre 276 meseci #11
Citat:

Ok, broj i jeste unsigned, al ne kontam dokle mi ide petlja ?



Dok broj ne postane jednak nuli, tj. kad svi bitovi „iscure“ sa desne

strane.


f
Re: Jel ovo greska u kompajleru ? 06.03.2004. u 12:32 · pre 276 meseci #12
E hvala ti, mnogo je bolje rešenje nego ono moje. Imaću mali problem oko menjanja koda ostatka programa (jer ovde prvo vadim LSB) ali nije strašno.

Thnx.
Potpis
Mali Oglasi
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme