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

Reply via email to