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