objective c - A float is supposed to be signed, so why is subtraction causing a wrap-around? -


  फ्लोट टेस्ट = -1;   

मान -1 के साथ एक फ्लोट का उत्पादन करता है। हालांकि,

  फ्लोट परीक्षण = arc4random ()% 500-500;   

भारी मूल्यों का उत्पादन करता है जो स्पष्ट रूप से एक बफर ओवरफ्लो के परिणामस्वरूप उत्पन्न होते हैं - चारों ओर रैपिंग संख्या। यह एक फ्लोट के साथ नहीं होना चाहिए; किक के लिए, मैंने यह देखने की कोशिश की कि क्या Xcode ने मुझे "हस्ताक्षरित फ़्लोट" बनाने की अनुमति दी थी, लेकिन उसने मुझे बताया कि "फ्लोट्स हस्ताक्षर या हस्ताक्षरित नहीं हो सकते हैं।"

मैंने एक काम किया- जहां मैंने एक हस्ताक्षरित किया int , फिर उसे एक फ्लोट पर डालें, लेकिन मुझे यह जानना बहुत खुशी होगी कि यह कैसे हुआ / कैसे हुआ।

arc4random () मैन पेज के अनुसार एक u_int32_t देता है, इसलिए arc4random ()% 500 -500 एक अहस्ताक्षरित पूर्णांक होगा, और 500 घटाकर आपको एक बहुत बड़ा सकारात्मक मूल्य देगा। इसके बजाय कोशिश करें:

  फ्लोट परीक्षण = ((फ्लोट) (arc4random ()% 500)) - 500;   

मैंने एक काम का निर्माण किया था, जहां मैंने एक हस्ताक्षरित इंट बनाया था, फिर उसे एक फ्लोट पर डाला, लेकिन मुझे यह जानना बहुत खुशी होगी कि यह कैसे हुआ / कैसे हुआ। >

एक समय में पूरी रेखा को एक टुकड़ा देखें। सबसे पहले, आपको मिल गया है:

  arc4random ()   

जैसा मैंने ऊपर कहा था, वह एक अहस्ताक्षरित int लौटाता है। चलो बहाना करते हैं कि यह मान 12345 देता है इसके बाद, आपको मॉड्यूलस ऑपरेटर मिला है, इसलिए आपकी अभिव्यक्ति कुछ समान है:

  12345% 500   

जो कि 345 < / code>। अगला, आप 500 घटाते हैं:

  345 - 500   

आपको लगता था कि आपको 155 देना होगा, लेकिन नहीं - हम अभी भी हैं अहस्ताक्षरित इनट्स के दायरे में काम कर रहे हैं, तो आप वास्तव में 4294967141 प्राप्त कर सकते हैं (या ऐसा कुछ - मेरा गणित बंद हो सकता है) फिर, आखिरकार, आप उसे एक फ्लोट के लिए निर्दिष्ट करते हैं:

  फ्लोट परीक्षण = 42 94967141;   

एक फ्लोट में मंटिसा के लिए केवल 23 बिट्स हैं, इसलिए मान जो कि test में संग्रहीत है, 4294967141 के सामान्य पड़ोस में होगा, लेकिन कम सटीकता के साथ, जैसे 42 9 4 9 70000।

Comments