目前測試,sizeof(long)在CentOS7(Linux)/AIX7(Unix)是8,在Win10(Windows)是4
參考文章
原因是不同平臺的C Language Data Model不同,Linux/Unix是LP64,Windows是LLP64
沒想到這是下一個千禧蟲問題!參考Wiki:
C語言的時間資料結構常見有timeval(舊版,< c11)或timespec(新版,>= c11)
struct timeval {
long tv_sec; /*seconds since 1/1/1970*/
long tv_usec; /*microseconds since tv_sec*/ //微秒
};
struct timespec {
time_t tv_sec; /*seconds since 1/1/1970*/
long tv_nsec; /*nanoseconds (valid values are [0, 999999999])*/ //奈秒
};
如果sizeof(long)或sizeof(time_t)是4,時間會在西元2038年用盡!
到時所有的32位元系統或程式取時間都會出現異常,連目前在64位元Windows上的C語言程式取時間也會異常
(不過微軟(MS)就是M$,相信在2038年以前,大家都會掏$給微軟,購買新版Windows,解決C Language Data Model問題)
從Linux/Unix傳遞時間給Windows,解析上要特別判斷,因為Linux/Unix上timeval或timespec是8+8=16個bytes,Windows上是4+4=8個bytes,反之亦然
自定義的資料結構,宜用long long取代long
int是4個bytes,最大值是2147483647,用來存放tv_usec(0~999999)或tv_nsec(0~999999999)都已經足夠
因為long tv_usec或long tv_nsec在Linux/Unix上,前4個bytes總是0,有特殊資料想隱藏時,可以利用前4個bytes儲存