Warum stürzt der folgende Code auf einem iPhone 5, aber nicht auf einem iPhone 5S ab?

8
%Vor%

Ich bekomme eine Ausnahme in der letzten Zeile: EXC_BAD_INSTRUCTION

Ich vermute, es hat etwas mit der Tatsache zu tun, dass das iPhone 5S 64 Bit ist, während die 5 nicht ist, aber ich sehe nichts in der obigen Funktion, die 64 Bit behandelt?

Bearbeiten

Ich konnte das Problem mit den folgenden Anpassungen lösen, aber ich kann immer noch nicht erklären warum.

%Vor%     
Snowman 12.08.2014, 21:22
quelle

2 Antworten

15

Der Ganzzahltyp Int ist eine 32-Bit-Ganzzahl auf dem iPhone 5 und eine 64-Bit-Ganzzahl auf dem 5S. Da arc4random() eine UInt32 zurückgibt, die den doppelten positiven Bereich von Int auf dem iPhone 5 hat, hat Ihre erste Version im Prinzip eine 50% ige Chance auf diese Zeile zu stürzen:

%Vor%

Ihre modifizierte Version wartet auf die Konvertierung, bis Sie die Modulo-Summe mit max übernommen haben. Es ist also sicher, dort in Int zu konvertieren. Sie sollten sich arc4random_uniform ansehen, das den Modulo für Sie übernimmt und eine Verzerrung vermeidet, die Ihrer aktuellen Implementierung innewohnt.

    
Nate Cook 12.08.2014, 22:28
quelle
6

Wie Sie herausgefunden haben, gibt arc4random eine vorzeichenlose 32-Bit-Ganzzahl zurück. Also 0 bis 4.294.967.295. Außerdem hat Int abhängig von dem System, auf dem es ausgeführt wird, eine andere Größe.

Von " Schnelle Referenz: "

%Vor%

Auf einem iPhone 5 hält Int nur -2.147.483.648 bis +2.147.483.647. Auf einem iPhone 5S kann Int -9,223,372,036,854,775,808 bis +9,223,372,036,854,775,807 enthalten. Eine vorzeichenlose 32-Bit-Ganzzahl kann einen Int32-Wert übertreffen, aber nie einen Int64.

Weitere Informationen zu der Frage, welche Zufallsfunktion verwendet werden soll und warum.

    
sanz 12.08.2014 22:29
quelle

Tags und Links