先说结论
(若有错误,欢迎指正)
<time.h>中定义的 time_t
是 long int
类型(64位系统),或者 long long int
类型(32位系统)。
也就是说,time_t
数据类型始终占8个字节。
查找过程
以下是 time.h 中的部分内容
(注:我在Ubuntu14.04查找的路径:/usr/include/time.h)
# include <bits/types.h> /* This defines __time_t for us. */
typedef __time_t time_t;
得出: time_t
是 __time_t
类型,而__time_t
在<bits/types.h>中定义
以下是 bits/types.h 中的部分内容
(注:我在Ubuntu14.04查找的路径:/usr/include/i386-linux-gnu/bits/types.h)
#if __WORDSIZE == 32
...//此处省略其它我们不用看的代码
/* We want __extension__ before typedef's that use nonstandard base types
such as `long long' in C89 mode. */
# define __STD_TYPE __extension__ typedef
#elif __WORDSIZE == 64
...//此处省略其它我们不用看的代码
/* No need to mark the typedef with __extension__. */
# define __STD_TYPE typedef
#else
# error
#endif
#include <bits/typesizes.h> /* Defines __*_T_TYPE macros. */
__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */
得出: time_t
就是 __TIME_T_TYPE
类型, 而__TIME_T_TYPE
是在<bits/typesizes.h>中定义的。
以下是 bits/typesizes.h 中的部分内容
(注:我在Ubuntu14.04查找的路径:/usr/include/i386-linux-gnu/bits/typesizes.h)
/* See <bits/types.h> for the meaning of these macros. This file exists so
that <bits/types.h> need not vary across different GNU platforms. */
/* X32 kernel interface is 64-bit. */
#if defined __x86_64__ && defined __ILP32__
# define __SYSCALL_SLONG_TYPE __SQUAD_TYPE
# define __SYSCALL_ULONG_TYPE __UQUAD_TYPE
#else
# define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
# define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE
#endif
#define __TIME_T_TYPE __SYSCALL_SLONG_TYPE
得出: time_t
是 __SQUAD_TYPE
类型(32位) 或 __SLONGWORD_TYPE
类型(64位)。
至于这2个类型,我找了半天没找到,最后回去刚才的<bits/types.h>中找到了。
回到刚才的 bits/types.h 并找到:
#define __SLONGWORD_TYPE long int
#if __WORDSIZE == 64
typedef long int __quad_t;
typedef unsigned long int __u_quad_t;
#else
__extension__ typedef long long int __quad_t;
__extension__ typedef unsigned long long int __u_quad_t;
#endif
#if __WORDSIZE == 32
# define __SQUAD_TYPE __quad_t
...//此处省略其它不用看的代码
#elif __WORDSIZE == 64
# define __SQUAD_TYPE long int
...//此处省略其它不用看的代码
#else
# error
#endif
得出:
__SLONGWORD_TYPE
就是long int
类型。__SQUAD_TYPE
在64位下是long int
类型,在32位下是__quad_t
类型。- 而
__quad_t
在64位下是long int
类型,在32位下是long long int
类型。
从而得出结论:
<time.h>中定义的 time_t
是 long int
类型(64位系统),或者 long long int
类型(32位系统)。
也就是说,time_t
数据类型始终占8个字节。
8个字节,有符号整型,那么表示正整数最大是:
2
63
−
1
(
大
概
90
亿
亿
)
2^{63}-1 (大概90亿亿)
263−1(大概90亿亿)
一年大概有: 365 * 24 * 60 * 60 = 31,536,000秒(3千万出头)
那么time_t
的数据类型可以表示大约:292,471,208,677年。。。。
等等,我没算错吧??约2900亿年!没想到竟然用不完,永垂不朽啊