דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. המרת מספר שלילי ל ushort

המרת מספר שלילי ל ushort

מתוזמן נעוץ נעול הועבר ארכיון code613m
16 פוסטים 3 כותבים 828 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • רחמיםר מנותק
    רחמיםר מנותק
    רחמים מורחק
    כתב ב נערך לאחרונה על ידי
    #1

    ב C# אני עושה כך והכל בסדר:

    code1.Value = -512;
     ushort num2 = (ushort)code1.Value;
    

    לאחר קוד זה הערך של num2 הוא 65024
    שזה למעשה המקסימום של ushort שזה 65535 ועוד המספר ועוד אחד כך:

    65024 = 65535 + (-512) +1
    

    אבל אם אני עושה אותו דבר ב VB אני מקבל שגיאה:

    Dim num2 As UShort = CUShort(code1.Value)
    
    
    Arithmetic operation resulted in an overflow.
    

    איך אני יכול אם כן לתרגם את הקוד הנ''ל ל VB ?

    תודה לכולם
    וחודש אדר שמח ! ! :smile:

    פורסם במקור בפורום CODE613 ב08/03/2014 21:55 (+02:00)

    תגובה 1 תגובה אחרונה
    0
    • clickoneC מנותק
      clickoneC מנותק
      clickone
      כתב ב נערך לאחרונה על ידי
      #2

      אני לא בטוח מה אתה רוצה לעשות.

      1. לעשות השמה של code1 לתוך Num2 (ולהמיר אותו לUshort כדי שהוא יוכל להכנס למשתנה)
      2. להוריד מהמקסימום של USHORT את הערך בcode1 ולהוסיף 1.

      אם אתה רוצה לעשות מה שכתוב באפשרות 2, נסה את:

      code1.value=-512
      num2=UShort.MaxValue + code1.value + 1
      

      פורסם במקור בפורום CODE613 ב09/03/2014 00:37 (+02:00)

      אין טסט כמו פרודקשן.

      המייל שלי urivpn@gmail.com

      תגובה 1 תגובה אחרונה
      0
      • רחמיםר מנותק
        רחמיםר מנותק
        רחמים מורחק
        כתב ב נערך לאחרונה על ידי
        #3

        אני רוצה לעשות את האפשרות 1.
        בגלל שהמטרה שלי זה לתרגם את הקוד C# לקוד VB, אלא שההמרה [cast] ב C# מביאה תוצאה ואילו המרה בVB מביאה שגיאה כך שתרגום 'רגיל' לא מתאים פה.

        פורסם במקור בפורום CODE613 ב09/03/2014 07:54 (+02:00)

        תגובה 1 תגובה אחרונה
        0
        • dovidD מחובר
          dovidD מחובר
          dovid ניהול
          כתב ב נערך לאחרונה על ידי
          #4

          תעשה ידנית:

          Dim num2 As UShort = code1.Value Mod UShort.MaxValue
          

          זה מאוד אופייני לVB שזה לא נעשה אוטומטית. ולכן אני כותב בVB 🙂

          אגב כל ההמרות מסוג הCXxxx לא עושות משהו של ממש, כלומר כל מקום שזה אפשרי, זה אפשרי גם בלעדי הפונקציה.
          זה שימושי כדי לגשת לחברים של המחלקה ע"י ההשלמה אוטומטית וכו', אבל לא יודע לי על משהו נוסף.

          פורסם במקור בפורום CODE613 ב09/03/2014 19:45 (+02:00)

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          1
          • רחמיםר מנותק
            רחמיםר מנותק
            רחמים מורחק
            כתב ב נערך לאחרונה על ידי
            #5

            מוציא שגיאה:

            Arithmetic operation resulted in an overflow.
            

            פורסם במקור בפורום CODE613 ב09/03/2014 19:50 (+02:00)

            תגובה 1 תגובה אחרונה
            0
            • clickoneC מנותק
              clickoneC מנותק
              clickone
              כתב ב נערך לאחרונה על ידי
              #6

              מה הערך של code1.value?
              עושה רושם שהבעייה נמצאת בערך שהוא מכיל, כי השגיאה היא שגיאה של הצפה (ז"א שהערך המושם גדול ממה שהמשתנה יכול להכיל)

              פורסם במקור בפורום CODE613 ב09/03/2014 20:05 (+02:00)

              אין טסט כמו פרודקשן.

              המייל שלי urivpn@gmail.com

              תגובה 1 תגובה אחרונה
              0
              • רחמיםר מנותק
                רחמיםר מנותק
                רחמים מורחק
                כתב ב נערך לאחרונה על ידי
                #7

                @ClickOne

                מה הערך של code1.value?
                עושה רושם שהבעייה נמצאת בערך שהוא מכיל, כי השגיאה היא שגיאה של הצפה (ז"א שהערך המושם גדול ממה שהמשתנה יכוללהכיל)

                הערך שלו כמו שכתוב למעלה (-512) וזו הצפה כיון שזה מחוץ לטווח של UShort שהוא בין 0 ל 65535

                פורסם במקור בפורום CODE613 ב09/03/2014 20:08 (+02:00)

                תגובה 1 תגובה אחרונה
                0
                • dovidD מחובר
                  dovidD מחובר
                  dovid ניהול
                  כתב ב נערך לאחרונה על ידי
                  #8

                  @רחמים

                  מוציא שגיאה:

                  Arithmetic operation resulted in an overflow.
                  

                  סליחה, הקוד שלי הוא קשקוש הן בזה שוהא לא פותר, והן בתוכנו (הוא חסר משמעות)... אני מיהרתי מידי.

                  אדהכי והכי ראיתי שאפשר לתת לVB.NET את ההתנהגות של C#. פשוט בC# בהגדרות הקומפילציה של הפרוייקט בברירת מחדל מסומן לא לבדוק גלישה, ובVB הברירת מחדל היא לבדוק, תוכל לשנות זאת במאפייני הפרוייקט, בכרטסת Compile תלחץ על Advanced ושם תנקה את התיבת סימון עם ה"Check Overflow". אח"כ תוכל לכתוב בדיוק כמו בהודעה הראשונה שלך באשכול והכל יעבוד טוב.

                  פורסם במקור בפורום CODE613 ב09/03/2014 20:08 (+02:00)

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  תגובה 1 תגובה אחרונה
                  0
                  • dovidD מחובר
                    dovidD מחובר
                    dovid ניהול
                    כתב ב נערך לאחרונה על ידי
                    #9

                    והנה קוד סוף סוף שיכפר על משוגתי:

                    Dim n As UShort = (i + UShort.MaxValue) Mod UShort.MaxValue
                    

                    פורסם במקור בפורום CODE613 ב09/03/2014 20:10 (+02:00)

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    תגובה 1 תגובה אחרונה
                    0
                    • רחמיםר מנותק
                      רחמיםר מנותק
                      רחמים מורחק
                      כתב ב נערך לאחרונה על ידי
                      #10

                      צריך להוסיף 1 כדי להגיע לאותה תוצאה שמתקבלת ב C# או בVB כאשר מגדירים לא לבדוק גלישה, כך:

                      Dim n As UShort = If(i < 0, i + UShort.MaxValue + 1, i Mod UShort.MaxValue)
                      

                      ועדיין זה טוב רק להמרת מספר שלילי ל UShort אבל אם המספר הוא מעל 65535 זה לא מביא את אותה התוצאה כמו ב C#.

                      פורסם במקור בפורום CODE613 ב09/03/2014 20:17 (+02:00)

                      תגובה 1 תגובה אחרונה
                      1
                      • רחמיםר מנותק
                        רחמיםר מנותק
                        רחמים מורחק
                        כתב ב נערך לאחרונה על ידי
                        #11

                        @דוד ל.ט.

                        אדהכי והכי ראיתי שאפשר לתת לVB.NET את ההתנהגות של C#. פשוט בC# בהגדרות הקומפילציה של הפרוייקט בברירת מחדל מסומן לא לבדוק גלישה, ובVB הברירת מחדל היא לבדוק, תוכל לשנות זאת במאפייני הפרוייקט, בכרטסת Compile תלחץ על Advanced ושם תנקה את התיבת סימון עם ה"Check Overflow". אח"כ תוכל לכתוב בדיוק כמו בהודעה הראשונה שלך באשכול והכל יעבוד טוב.

                        אכן זה מה שקורה, אבל אני לא מבין את זה אם הוא לא בודק גלישה ולא מוציא שגיאה מילא אבל על פי איזה חישוב הוא הגיע ל 65024 ???

                        פורסם במקור בפורום CODE613 ב09/03/2014 20:20 (+02:00)

                        תגובה 1 תגובה אחרונה
                        0
                        • רחמיםר מנותק
                          רחמיםר מנותק
                          רחמים מורחק
                          כתב ב נערך לאחרונה על ידי
                          #12

                          @דוד ל.ט.

                          אגב כל ההמרות מסוג הCXxxx לא עושות משהו של ממש, כלומר כל מקום שזה אפשרי, זה אפשרי גם בלעדי הפונקציה.
                          זה שימושי כדי לגשת לחברים של המחלקה ע"י ההשלמה אוטומטית וכו', אבל לא יודע לי על משהו נוסף.

                          אם אתה מסב את המספר 1 מטיפוס integer לטיפוס byte אתה למעשה מקבל את אותו מספר אבל הוא כבר לא תופס 4 ביתים אלא רק בית 1 ! וזו יכולה להיות נפק''מ להרבה דברים.
                          אם אתה לא משתמש בפונקציות ההסבה ולא קופצות שגיאות זה משום שהמהדר 'ניחש' טוב וידע בעצמו איפה להכניס את ההסבה, עיין ברפלקטור ותראה, כך שלמעשה תמיד יש הסבות רק כיון שזו שפה מאוד עילית אנו לא מרגישים בזה.

                          לדוגמא באותו קוד שאני עובד כעת לתרגם אותו לVB היו עוד כמה שגיאות לאחר התרגום שנבעו מהצורה שבה המהדר מחליט להכניס הסבות בין טיפוסים, שהמהדר של C# החליט להמיר איזה byte ל int והמהדר של VB החליט להשאיר את זה ב byte
                          והכל בגלל שהמתכנת ב C# כתב קוד שרץ לו טוב ולא הוציא שגיאות אבל היה 'חסר' הסבות 'מפורשות' והן הושלמו אוטומית והוא אפילו לא הרגיש! ואז כשמחליפים מהדר פתאום כל זה קופץ.

                          פורסם במקור בפורום CODE613 ב09/03/2014 20:27 (+02:00)

                          תגובה 1 תגובה אחרונה
                          0
                          • dovidD מחובר
                            dovidD מחובר
                            dovid ניהול
                            כתב ב נערך לאחרונה על ידי
                            #13

                            @רחמים

                            אם אתה מסב את המספר 1 מטיפוס integer לטיפוס byte

                            ואני אמרתי שאפשר להסב בלי להזדקק לCByte.

                            פורסם במקור בפורום CODE613 ב09/03/2014 20:49 (+02:00)

                            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                            בכל נושא אפשר ליצור קשר dovid@tchumim.com

                            תגובה 1 תגובה אחרונה
                            0
                            • dovidD מחובר
                              dovidD מחובר
                              dovid ניהול
                              כתב ב נערך לאחרונה על ידי
                              #14

                              @רחמים

                              @דוד ל.ט.
                              אדהכי והכי ראיתי שאפשר לתת לVB.NET את ההתנהגות של C#. פשוט בC# בהגדרות הקומפילציה של הפרוייקט בברירת מחדל מסומן לא לבדוק גלישה, ובVB הברירת מחדל היא לבדוק, תוכל לשנות זאת במאפייני הפרוייקט, בכרטסת Compile תלחץ על Advanced ושם תנקה את התיבת סימון עם ה"Check Overflow". אח"כ תוכל לכתוב בדיוק כמו בהודעה הראשונה שלך באשכול והכל יעבוד טוב.

                              אכן זה מה שקורה, אבל אני לא מבין את זה אם הוא לא בודק גלישה ולא מוציא שגיאה מילא אבל על פי איזה חישוב הוא הגיע ל 65024 ???

                              ואני שובר את הראש להבין את C# 🙂

                              פורסם במקור בפורום CODE613 ב09/03/2014 20:50 (+02:00)

                              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                              בכל נושא אפשר ליצור קשר dovid@tchumim.com

                              תגובה 1 תגובה אחרונה
                              0
                              • dovidD מחובר
                                dovidD מחובר
                                dovid ניהול
                                כתב ב נערך לאחרונה על ידי
                                #15

                                רחמים, אתה צודק, רק כעת הבנתי את הלוגיקה של C#.
                                הוא מתייחס לאוסף המפרים המוגבל כמעגלי. הראשון הוא הבא בתור אחרי האחרון ולהפך.
                                לפי זה המקסימום +1 זה אפס ולא 1. ו-1 זה המקסימום.
                                זה נראה לי תקין:

                                Dim n As UShort = (i + (UShort.MaxValue + 1)) Mod (UShort.MaxValue + 1)
                                

                                ובקשר לVB אתה טועה, הוא סבור בדיוק כמו C#, לפחות אצלי.
                                עריכה:
                                כדי להיווכח בהבדל עליך כנראה לשנות משהו בקוד כל שהוא, אחרת הוא לא מקמפל שוב (הוא בודק כנראה שזה כבר מקומפל מפעם קודמת).

                                פורסם במקור בפורום CODE613 ב09/03/2014 21:18 (+02:00)

                                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                תגובה 1 תגובה אחרונה
                                1
                                • רחמיםר מנותק
                                  רחמיםר מנותק
                                  רחמים מורחק
                                  כתב ב נערך לאחרונה על ידי
                                  #16

                                  @דוד ל.ט.

                                  הוא מתייחס לאוסף המפרים המוגבל כמעגלי. הראשון הוא הבא בתור אחרי האחרון ולהפך.
                                  לפי זה המקסימום +1 זה אפס ולא 1. ו-1 זה המקסימום.

                                  למה זה כך?

                                  @דוד ל.ט.

                                  ובקשר לVB אתה טועה, הוא סבור בדיוק כמו C#, לפחות אצלי.

                                  אם אני מגדיר בVB שלא יבדוק גלישה אז הוא מתנהג כמו C#

                                  אבל אני כן רוצה שהוא יבדוק גלישה! זה מונע הרבה שגיאות.

                                  בכל אופן המסקנה שאני הגעתי אליה היא זו:

                                  Dim num2 As UShort = BitConverter.ToUInt16(BitConverter.GetBytes(code1.Value), 0)
                                  

                                  כשעושים כך אין שגיאות גלישה והתוצאה ממש כמו ב C#

                                  מה שרואים כאן זה שלפני שממירים ל ushort צריך להמיר את המספר השלילי לביתים ואת הביתים ל ushort ואז ברור שלא תהיה גלישה. וזה מה שC# עושה באופן אוטומטי.
                                  ואני חושב אם תתבונן בנושא הסיביות (כשעושים להם shift) תראה שהמסקנה שלך ושלי עולות בקנה אחד.

                                  פורסם במקור בפורום CODE613 ב09/03/2014 22:12 (+02:00)

                                  תגובה 1 תגובה אחרונה
                                  1

                                  בא תתחבר לדף היומי!
                                  • התחברות

                                  • אין לך חשבון עדיין? הרשמה

                                  • התחברו או הירשמו כדי לחפש.
                                  • פוסט ראשון
                                    פוסט אחרון
                                  0
                                  • דף הבית
                                  • קטגוריות
                                  • פוסטים אחרונים
                                  • משתמשים
                                  • חיפוש
                                  • חוקי הפורום