2015-08-21 38 views
-2

存储日期我正在读一让美国C的书,在存储日期在两个字节的公式是有两个字节

int year = 1990, month = 03, day=22 

date = 512*(year-1980)+32*month+day 

我不明白上面的公式,比如为什么1980年被减数给定年份,然后乘以512,然后乘以32和月份并加上日期。

有人请解释我上面的公式。 在此先感谢。

+1

表示“日期”的声明。 “负数如何存储在位?”这是正确的问题 - 考虑一下。 – Olaf

+1

512和32是2的幂。乘以它们直接相当于按位“左移”操作。 1980年就是这个日期系统的“时代” - 时间0. –

+2

@MarcB:它实际上是不相关的,如果它们是2的幂。它们只需要大于最大值。下部的可能值。 – Olaf

回答

3

上面的表格只存储5位数的日期(1-31或0-30),4位数的月份(0-11或1-12)和7位数的年份只能存储2字节。

时代这里是1980年,这意味着在1980年到2127年之间的所有年份都会好的。我的建议是避免负面价值并选择合适的开始年份。例如date = 512*(year-1950)+32*month+day会为1950年和2077

我劝你还是避免负值,因为符号值右移由标准为实现相关所以你可以不知道规定岁之间被罚款,如果新的位将被填充与1或0.所以即使你想要处理值,总是使用unsigned short为你2字节值或uint16_t有确定性的转变。

+0

非常感谢你的解释! – Aravind