Hallo Tassilo, >mir ist folgendes aufgefallen, und ich denke das ist ein Bug: > >$ echo $((1<<32)) $((1<<<32)) $((1>>2)) $((1>>>2))
ja, das ist ein Bug, allerdings in der Eingabe ;-) >Ich wC<rde erwarten "0 1 0 1073741824" zu sehen. Die kriegst Du nie zu sehen. Wir müssen hier zwei Fälle unterscheiden: │ mksh │ lksh ────────────────┼───────────────┼───────────────────────── Rechenwortgröße │ C „int32_t“¹ │ C „long“² Wortüberlauf │ Wraparound │ C „Undefined Behaviour“ LShift Überlauf │ & 31 │ C „Undefined Behaviour“³ Das bedeutet, 1 SHL 32 ist äquivalent zu 1 SHL (32 & 31) = 1 SHL 0 = 1 in mksh, während es in lksh und POSIX sh UB ist⁴. Somit ist die Ausgabe „1 1 0 1073741824“ korrekt für mksh, und in lksh und POSIX sh hast Du Glück, wenn schon $((1<<32)) nicht Deine gesamten Daten löscht oder den Computer explodiert⁵. Ob die Shell nun rotiert, shiftet oder nix tut kannst Du auch herausfinden: tg@blau:~ $ echo $((65539 << 16)) $((65539 <<< 16)) 196608 196609 Carry Flag gibt’s allerdings nicht. >GrC<C^_e, und vielen Danke nochmal fC<r mksh, absolut meine Lieblingsshell, Freut mich! Gruß //mirabilos PS: Sowas gern auch an die Mailingliste, gern auch auf deutsch. Wenn es von Deiner Seite her okay ist würde ich diese zwei eMails gerne an die Liste bouncen. ① ohne baut mksh nicht ② IEEE 1003.1:2013 §2.6.4 Absatz 3 Punkt 1 ③ ISO 9899:1999 §6.5.7(3) Satz 2 ④ und damit sogar äquivalent zu „rm -rf ~ /“ sein darf(!) ⑤ ⁴ gilt übrigens auch für $((2147483647 + 1)) (auf einem 32-Bit-System) -- 22:20⎜<asarch> The crazy that persists in his craziness becomes a master 22:21⎜<asarch> And the distance between the craziness and geniality is only measured by the success 18:35⎜<asarch> "Psychotics are consistently inconsistent. The essence of sanity is to be inconsistently inconsistent