读书笔记:关于 time_t

1.寻找 time_t 定义

本人的系统是:Debian GNU/Linux jessie/sid 64 位

寻找time_t 的定义:

    在  /usr/include/time.h 文件中的 time_t 定义如下:

    typedef __time_t time_t;

于是寻找 __time_t 的定义。

    在 /usr/include/x86_64-linux-gnu/bits/types.h 文件中的 __time_t 的定义如下:

    __STD_TYPE __TIME_T_TYPE __time_t;  /* Seconds since the Epoch.  */

于是寻找 __TIME_T_TYPE 的定义,然后迷路了……

    结果在 /usr/include/x86_64-linux-gnu/bits/typesizes.h 中找到了如下定义

    #define __TIME_T_TYPE       __SYSCALL_SLONG_TYPE

    暂且估计 time_t 是 long 类型吧。

2.验证 time_t

用如下代码进行验证,文件名保存为 03.c:

#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[])
{
    time_t timer =  0xFFFFFFFFFF;

    printf("sizeof(time_t) = %ld\n", sizeof(time_t));

    printf("timer = %ld\n", timer);
    printf("timer = %s\n", ctime(&timer));

    return 0;
}

使用gcc 开启警告选项,进行编译:

gcc 03.c -Wall

无错误,无警告。

其中的

 printf("timer = %ld\n", timer);

也侧面验证了time_t 为 long 或者是 unsigned long 类型。因为在gcc  开启警告的模式下,输出类型不匹配会发出警告。如果将其改为: 

printf("timer = %d\n", timer);

则会产生如下警告:

$ gcc 03.c -Wall
03.c: In function ‘main’:
03.c:10:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘time_t’ [-Wformat=]
  printf("timer = %d\n", timer);
  ^

不过,究竟是 long 还是 unsigned long 不能通过警告来确定,因为 "%lu" 和 "%ld" 两个都无警告信息产生。

运行之前的编译好的源程序,输出结果如下:

$ ./a.out 
sizeof(time_t) = 8
timer = 1099511627775
timer = Mon Feb 20 08:36:15 36812

本人系统为64位,long 位64位整型,这个数字就好大好大好大了,所以64位系统不用担心时间溢出的问题了。

根据《UNIX网络编程(第3版)》卷1中文版,P24页:

现有32位Unix系统上共同的编程模型位ILP32模型,表示整数(I)、长整数(L)和指针(P)都占用32位。64位Unix系统上变得流行的模型称为LP64模型,表示只有长整数(L)和指针(P)占用64位。

但是32位系统,如果定义位long 可能就会有问题了。32 位的 long只能跑到到 2038年,和《C专家编程》 书上P5 的案例相同。

你可能感兴趣的:(读书笔记,《C专家编程》)