![]() | |
| |||||||
| Home | Register | Blogs | FAQ | Members List | Calendar | Downloads | Arcade | Mark Forums Read |
| Algorithms The source of algorithms for your project |
![]() |
| | LinkBack | Thread Tools | Display Modes |
| | #1 |
| Administrator | Проооооостенькая задачка :d Code: int sCount; unsigned int shiftedMask; sCount = 0L; shiftedMask = 0xFFFFFFFF >> (32 - sCount); P.S. советую ответ проверить на реальном приложении ![]()
__________________ И повешенные могут качаться в неположенную сторону. /С.Е.Лец/ |
| | |
| | #2 | ||
| Бакалавр Join Date: Mar 2002 Location: Detroit, MI, USA
Posts: 482
Rep Power: 7 Reputation:
10 | Re: Проооооостенькая задачка :d Quote:
Quote:
![]()
__________________ Hovhannes Tumanyan, CISSP | ||
| | |
| | #6 | |
| Administrator | Quote:
it does not depend on compiler. I checked that up for Borland compiler, too.
__________________ И повешенные могут качаться в неположенную сторону. /С.Е.Лец/ | |
| | |
| | #7 | |
| Administrator | Quote:
ответ Tumanyan-а разъясняет все. Мистика. Фантастика. ![]()
__________________ И повешенные могут качаться в неположенную сторону. /С.Е.Лец/ | |
| | |
| | #8 |
| Administrator | лишь уточню: вышесказанное относится только к типу "int32" если я сдвину "unsigned char" на "8" бит вправо, получу законный "0". ![]() takie pirogi. t.e. tortiki.
__________________ И повешенные могут качаться в неположенную сторону. /С.Е.Лец/ |
| | |
| | #9 |
| ЙЦУКЕН | pered tem kak sdvigat' priwedi k unsigned ..... |
| | |
| | #10 | |
| ЙЦУКЕН | 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 :))) | |
| | |
| | #11 | |
| Administrator | Quote:
![]()
__________________ И повешенные могут качаться в неположенную сторону. /С.Е.Лец/ | |
| | |
| | #12 |
| Administrator | 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.
__________________ И повешенные могут качаться в неположенную сторону. /С.Е.Лец/ |
| | |