один и тот же Int имеет разные значения в Swift, mysterious riddle

#swift #random #integer #nslog

#быстрый #Случайный #целое число #nslog

Вопрос:

с помощью этого кода :

 let rand : Int = Int(arc4random())
NSLog("rand = %d %i %@ (rand)",rand,rand,String(rand))
 

Я получаю :

 rand = -1954814774 -1954814774 2340152522 2340152522
 

почему все 4 значения не совпадают ?

Комментарии:

1. может быть, связано с функцией arc4random() -> UInt32, но почему?

2. Может быть, это имеет какое-то отношение к подписанному или неподписанному? Int amp; Double подписаны, интерпретации строк не

3. согласно developer.apple.com/documentation/swift/int Int — это целочисленный тип значения со знаком.

4. «На 32-разрядных платформах Int имеет тот же размер, что и Int32, а на 64-разрядных платформах Int имеет тот же размер, что и Int64». так что, вероятно, есть связь с 32/64 битами, но я все еще не понимаю, каково значение rand

Ответ №1:

arc4random генерирует 32-битный int без знака. Int вероятно, 64-разрядный на вашем компьютере, поэтому вы получаете тот же номер, и он не переполняется. Но %i и %d являются 32-разрядными спецификаторами формата со знаком. Смотрите здесь и здесь . Вот почему вы получаете отрицательное число, когда arc4random возвращает число больше 2 ^ 32-1 , иначе Int32.max .

Например, когда генерируется 2340152522, вы попадаете -1954814774 в %i положение, потому что:

 Int32(bitPattern: 2340152522) == -1954814774
 

С другой стороны, преобразование Int в String число не изменит число. Int является 64-разрядным целым числом со знаком.

Комментарии:

1. это имеет смысл, спасибо! Я понимаю, что мне не следует использовать %i и %d . Безопасно ли использовать Int(arc4random()) или лучше придерживаться 32-битного int ?

2. @Gogo123 вы должны использовать Int.random(in: 0...10)