![]() |
![]() | #1 |
Академик Join Date: 09 2001 Location: inside myself
Posts: 5,368
Downloads: 0 Uploads: 0
Reputation: 18 | 5 | ![]() Code: int sCount; unsigned int shiftedMask; sCount = 0L; shiftedMask = 0xFFFFFFFF >> (32 - sCount); P.S. советую ответ проверить на реальном приложении ![]() |
![]() |
![]() | #2 | ||
Бакалавр Join Date: 03 2002 Location: Detroit, MI, USA
Posts: 482
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]() Quote:
Quote:
![]() | ||
![]() |
![]() | #7 | |
Академик Join Date: 09 2001 Location: inside myself
Posts: 5,368
Downloads: 0 Uploads: 0
Reputation: 18 | 5 | ![]() Quote:
ответ Tumanyan-а разъясняет все. Мистика. Фантастика. ![]() | |
![]() |
![]() | #10 | |
ЙЦУКЕН Join Date: 07 2002 Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77 Age: 51
Posts: 3,118
Downloads: 0 Uploads: 0
Reputation: 5 | 0 | ![]() Quote:
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.... 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 :))) | |
![]() |
![]() | #12 |
Академик Join Date: 09 2001 Location: inside myself
Posts: 5,368
Downloads: 0 Uploads: 0
Reputation: 18 | 5 | ![]()
bystryj gonzales. spasibo za intro v sparkovskiy ASM. oba kompillera dali odin i tot je rezul'tat - "-1", verno ? tak chto eto ne ficha kompillera, skoree vsego. ![]() predlagayu proverit' eto, sdvigaya na 33 bita. |
![]() |