关于time.h中定义的time_t是什么数据类型

先说结论

(若有错误,欢迎指正)
<time.h>中定义的 time_tlong 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

得出:

  1. __SLONGWORD_TYPE 就是 long int类型。
  2. __SQUAD_TYPE在64位下是 long int类型,在32位下是__quad_t类型。
  3. __quad_t在64位下是 long int类型,在32位下是long long int类型。

从而得出结论:
<time.h>中定义的 time_tlong int 类型(64位系统),或者 long long int 类型(32位系统)。
也就是说,time_t 数据类型始终占8个字节。

8个字节,有符号整型,那么表示整数最大是:
2 63 − 1 ( 大 概 90 亿 亿 ) 2^{63}-1 (大概90亿亿) 2631(90亿亿)
一年大概有: 365 * 24 * 60 * 60 = 31,536,000‬秒(3千万出头)
那么time_t的数据类型可以表示大约:292,471,208,677年。。。。
等等,我没算错吧??约2900亿年!没想到竟然用不完,永垂不朽啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值