首页 > 解决方案 > Int32 到 Epoch 到可读数据?![C]

问题描述

好的,所以,我在这里有这个功能,它确实有效,但我不明白。

为什么它会这样工作:

void timeToData(unsigned __int32 timeH)
{
     struct tm *newtime;
     time_t long_time = timeH;
     newtime = localtime(&long_time);
     printf("%s\n", asctime(newtime));  
}

而不是这样?

void timeToData(unsigned __int32 timeH)
{
     struct tm newtime;
     newtime = timeH;
     printf("%s\n", asctime(newtime));  
}

标签: c

解决方案


您的非工作版本尝试将数字类型的值分配给 type 的对象struct tm

     struct tm newtime;
     newtime = timeH;

没有为此类分配定义任何行为,并且除了完全拒绝代码之外,还不清楚可以预期什么行为。当它确实拒绝该代码时,您的编译器肯定会发出一个诊断信息,说明它之所以这样做是因为运算符的操作数不兼容=

您的非工作版本还尝试将类型参数传递struct tm给 function asctime(),它需要一个指向这种结构的指针:

    printf("%s\n", asctime(newtime));  

结构和指向它们的指针不可互换。您的编译器也可能会对此进行诊断,发出一条或多条关于不兼容类型的附加错误消息。

现在让我们考虑工作版本。我首先注意到,newtime在该版本中,局部变量的声明方式不同,作为指向 a的指针struct tm

    struct tm *newtime;

这就解决了上面的第二个问题。我还注意到这struct tm *也是函数返回的类型localtime(),因此将该函数的结果分配给它newtime是非常好的。

从那里,我们观察到参数localtime必须有类型time_t *,这正是表达式的类型&long_time,因为它long_time本身是一个time_t

因此,我看到的唯一可能的混淆点围绕着timeH, an unsigned __int32, 到 variable的分配long_time。然而,除非发生了一些令人讨厌的混淆,否则它unsigned __int32是一个整数类型。此外,该标准告诉我们,这time_t是“能够代表时间的真实 [类型]”(C2011,第 7.27.1/3 段)。在这种情况下,“真实”具有基于该术语的数学用法的含义;总的来说,它time_t是一种没有虚部的数字类型——它可以表示的值是实数的子集。

没有具体说明什么类型time_t,但 C 广泛允许在不同数字类型之间进行赋值,几乎没有警告或限制。因此,即使我们不知道确切的类型time_t是什么,也没有什么特别的理由可以假设分配是无效的。作为实现的质量问题,赋值是保值的也就不足为奇了(这在实践中通过函数起作用的事实得到证明)。


推荐阅读