C 如何在64位系统上以32位宽度存储时间?

C 如何在64位系统上以32位宽度存储时间?,c,C,我的结构如下: typedef struct ERROR_LOG_EVENT { time_t time; uint32_t count; int32_t error_type; } ERROR_LOG_EVENT; 我将此结构存储在非易失性内存中。 在32位系统上,一切正常,因为time\t的宽度为4字节(32位) 但在64位系统上,时间变为8字节(64位) 在64位系统上,是否有办法将时间存储在4字节(32位)中? 我是否可以将上述结构的time\u t time

我的结构如下:

typedef struct  ERROR_LOG_EVENT
{
    time_t time;
    uint32_t count;
    int32_t error_type;
} ERROR_LOG_EVENT;
我将此结构存储在非易失性内存中。 在32位系统上,一切正常,因为
time\t
的宽度为4字节(32位)

但在64位系统上,时间变为8字节(64位)

在64位系统上,是否有办法将时间存储在
4字节(32位)
中?
我是否可以将上述结构的
time\u t time
成员替换为始终保证为32位的内容?

使用
uint32\u t
。如果这些是unix纪元时间,这将足以存储不超过2105年的时间戳。

如果内存空间优化是您的目标(以降低访问速度为代价,且时间限制为2106),则应将结构定义为
压缩
,以抑制填充:

typedef struct __attribute__((__packed__)) ERROR_LOG_EVENT {
    uint32_t time;
    uint32_t count;
    int32_t error_type;
} ERROR_LOG_EVENT;
然后这样分配:
ERROR\u LOG\u EVENT.time=&0xFFFFFFFF

调整代码以正确处理64位时间戳。具体来说,写一些看起来像

typedef struct  ERROR_LOG_EVENT
{
    int64_t time;
    uint32_t count;
    int32_t error_type;
} ERROR_LOG_EVENT;

并强制您的32位代码使用此代码。不要尝试使用32位整数存储时间间隔。这总是一个坏主意,这是在你遇到“哦,设计要求改变了,我们实际上想节省纳秒,而不是秒”的问题之前。是的,你可以,但前提是你认为你的程序不会在2106年以后使用(如果使用例如
uint32\u t
)。而时间实际上是一个整数,计算自1970-01-01以来的秒数。(如果时间段早,那么结束日期当然也会更快。)如果您要节省内存空间,那么64位
time\u t
?有什么问题,您需要在64位系统上使用int32处理结构的填充/对齐问题。@Someprogrammerdude我认为问题不在于2106,而在于更早:如果我们使用带符号的
time\u t
。只有21年了。@chux的签名32位时间是的。为什么我需要
打包
?我相信对于这个结构来说,
更严格的对齐方式是4字节。如果我错了,请纠正我这取决于您使用的编译器和您使用的编译选项。。。