#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)