Quote:
Originally posted by nm
pered tem kak sdvigat' priwedi k unsigned .....
|
ja imel w widu chto-to tipa
((unsigned int)0xFFFFFFFF) >> bitcount ...
dlja signed chisla (proc/kompiler) objazan delat' rasshirenie znakowogo bita (starshego) i hren ego znaet kak imenno ono eto sdelaet ... dependz, kak gritsja .... w sluchae sdviga unsigned chisla dolzhno wse byt' tip top
effiop twoju .... poprobowal ;)
gcc version 3.3.1 [FreeBSD] 20030711 (prerelease)
--------------
int sCount;
unsigned int shiftedMask;
sCount = 0L;
shiftedMask = ((unsigned int)0xFFFFFFFF) >> 32;
wot eto daet
warning pri kompiljacii
warning: right shift count >= width of type
no predskazuemyj otwet 0x00 :))) - kak pokazywaet disassemble - eto wychislil kompiljator (prawil'no, tak i dolzhno byt':)
--------
poshli dal'she :)
int sCount;
unsigned int shiftedMask;
sCount = 0L;
shiftedMask = 0xFFFFFFFF >> (32 - sCount);
wot eto daet rezul'tat 2^31-1
tak tebja . smotriw w disassembly, notacija ATT (porjadok argumentow prjamo protivopolozhnyj intelowskomu :)))) t.e. mov SOURCE, DESTINATION :)
Code:
.....skip....
// sCount == 0
0x80484e4 <main+16>: movl $0x0,0xfffffffc(%ebp)
// 32 -> ecx
0x80484eb <main+23>: mov $0x20,%eax
0x80484f0 <main+28>: mov %eax,%ecx
// 32 - sCount -> ecx
0x80484f2 <main+30>: sub 0xfffffffc(%ebp),%ecx
0x80484f5 <main+33>: mov $0xffffffff,%eax
0x80484fa <main+38>: shr %cl,%eax
.....cut....
ahha. problema processora? smotrim ;)
gcc version 3.2, sparc-sun-solaris2.7
dlja tex kto bachit na sparkowskom asme :)
Code:
// pochistit' jachejku w steke sCount
0x10678 <main+12>: clr [ %fp + -20 ]
// 32 -> o1
0x1067c <main+16>: mov 0x20, %o1
// sCount -> o0
0x10680 <main+20>: ld [ %fp + -20 ], %o0
// 32 - sCount -> o1
0x10684 <main+24>: sub %o1, %o0, %o1
// -1 !!!!! -> o0
0x10688 <main+28>: mov -1, %o0
// o0 >> o1 -> o0
0x1068c <main+32>: srl %o0, %o1, %o0
// o0 -> shiftedMask
0x10690 <main+36>: st %o0, [ %fp + -24 ]
wobshem sparkowskij kod nagljadno pokazal w chem imenno problema - ono schitaet,chto 0xFFFFFFFF - eto -1, dazhe pri tom chto ono objavleno unsigned ;)
wobshem standart praw - jawno najdetsja kompil', kotoryj re**** eto kak-to po swoemu :)))