[ Ivan Vasić @ 03.03.2004. 22:44 ] @
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
[ NastyBoy @ 03.03.2004. 22:55 ] @
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
[ iinmii @ 03.03.2004. 22:58 ] @
probaj sa long int
koliko ja znam unsigned int range je 0-FFFF
[ filmil @ 03.03.2004. 22:59 ] @
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

[ Reljam @ 04.03.2004. 00:23 ] @
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.
[ Ivan Vasić @ 04.03.2004. 10:00 ] @
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 ....
[ filmil @ 04.03.2004. 10:06 ] @
"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

[ Ivan Vasić @ 04.03.2004. 10:30 ] @
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 !
[ filmil @ 04.03.2004. 11:02 ] @
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

[ Ivan Vasić @ 05.03.2004. 13:28 ] @
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 ?
[ filmil @ 05.03.2004. 13:44 ] @
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
[ Ivan Vasić @ 06.03.2004. 11:32 ] @
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.