C Int32到历元到可读数据?![丙]

C Int32到历元到可读数据?![丙],c,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(unsigne

好的,我这里有一个函数,它确实起作用,但我不明白

为什么它是这样工作的:

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));  
}

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

     struct tm newtime;
     newtime = timeH;
    struct tm *newtime;
没有为这样的赋值定义任何行为,除了完全拒绝代码之外,还不清楚预期的行为是什么。当它拒绝该代码时,您的编译器肯定会发出一个诊断,说明它拒绝该代码是因为
=
运算符的操作数不兼容

您的非工作版本还尝试将类型为
struct tm
的参数传递给函数
asctime()
,该函数需要指向此类结构的指针:

    printf("%s\n", asctime(newtime));  
结构和指向它们的指针是不可互换的。编译器也可能会对此进行诊断,并发出一条或多条关于不兼容类型的附加错误消息

现在让我们考虑一下工作版本。我首先注意到局部变量
newtime
在该版本中的声明不同,它是指向
struct tm
的指针:

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

从这里,我们观察到,
localtime
的参数必须具有类型
time\t*
,这正是表达式
&long\u-time
的类型,因为
long\u-time
本身就是一个
time\t

因此,我所看到的唯一剩下的可能混淆点围绕着
timeH
的赋值,一个
无符号的int32
,到变量
long\u time
。然而,除非发生了令人讨厌的混淆,
unsigned\u int32
是一种整数类型。此外,该标准告诉我们,
time\u t
是一种“能够表示时间的真实[类型]”(C2011,)。在这种情况下,“真实”的含义基于该术语的数学用法;总的来说,
time\u t
是一种没有虚部的数字类型,也就是说,它可以表示的值构成实数的子集


没有指定时间的确切类型,但C广泛地允许在不同的数字类型之间赋值,很少有警告或限制。因此,即使我们不知道确切的
time\u t
是什么类型,也没有特别的理由认为赋值是无效的。作为一个实现质量问题,赋值是保值的(这在实践中通过函数工作的事实得到证明)并不奇怪。

请参阅相关问题,在这种情况下,这可能很有用。函数的哪些方面让您感到困惑或惊讶?您需要了解的所有信息都可以在此处找到: