שאלה לגבי time_t

zagzagzag

New member
שאלה לגבי time_t

יש איזשהי דרך פשוטה לדעת מהו הזמן המקסימלי (כלומר מספר השניות המקסימלי) שאני יכול לייצג על המחשב שלי ? אני מתכוון לדרך פשוטה יותר מזו -
pow( 2, sizeof(time_t)*8-1 ) - 1​
אני יודע שאני יכול להשתמש ב-INT_MAX אבל זו לא דרך פורטבילית (או שכן ?). ניסיתי לחפש ב-time.h וב-limits.h אבל לא מצאתי. אני עובד ב-C בסביבת לינוקס
 

vinney

Well-known member
זה פשוט

נתחיל מזה ש time_t זה long, בLIMITS.H יש מקרו LONG_MAX שמגדיר מה הגודל המקסימלי החיובי שלו. גודל של LONG משתנה ממערכת למערכת, אבל הספירה של time_t מתחילה תמיד מחצות של ראשון לינואר 1970. זה יכול להיות גם ערך שלילי, אגב.
 

voguemaster

New member
אמממ... למה ?

זה לא הגיוני אבל אם כבר, אז כבר:
time_t maxTime = 0; maxTime = ~maxTime; // should give 0xFFFFFFFF​
 

עופר ב.ה

New member
זה לא טוב

כי time_t הוא long ולא unsigned long. הייצוג המקסימלי הוא 0x7FFFFFFF. שזה מתישהו ב 2038. לכן גם מדובר על באג 2038, שהשלכותיו עלולות להיות חמורות בהרבה מ"באג 2000", כיוון שכל המערכות מבוססות יוניקס תפסקנה לייצג את הזמן באופן תקין.
 

voguemaster

New member
טוב טוב צודקים זה, SIGNED

שני דברים: 1. או להשתמש ב-LONG_MAX או לחשב אותו לבד פעם אחת (והחישוב שהוצג בהתחלה לא נכון), כך:
time_t maxTime = 1 << (sizeof(time_t)*8 - 1); // gives us 0x80000000; maxTime = ~maxTime;​
אפשר גם באסמבלי לעשות הזזה אחת בכיוון ההפוך אבל זה לא פורטבילי.. 2. אין שום בעית "באג 2038" מהסיבה הפשוטה שמערכות ההפעלה הולכות להשתפר לא מעט ב-34 שנים הקרובות. זה מגוחך לחשוב שימשיכו להשתמש באותה שיטת ייצוג עבור זמנים.
 

vinney

Well-known member
אכן כך חשבו כשהמציאו את COBOL...

LONG_MAX הרבה יותר בטוח.
 
למעלה