Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么DateTime.Now会设置DateTime中的最高位';什么是通常的二进制表示?_C#_.net_Datetime - Fatal编程技术网

C# 为什么DateTime.Now会设置DateTime中的最高位';什么是通常的二进制表示?

C# 为什么DateTime.Now会设置DateTime中的最高位';什么是通常的二进制表示?,c#,.net,datetime,C#,.net,Datetime,据我所知,DateTime和TimeSpan结构的二进制表示是8字节的刻度(根据TimeSpan.TicksPerSecond,1毫秒=10000个刻度)。以及天、小时、分钟等的值。属性通过整数除法在TicksPerDay、TicksPerHour、TicksPerSecond等时间跨度的常数获得 例如,如果运行此代码: TimeSpan s1 = new TimeSpan(3, 5, 7, 9, 11).AddTicks(13)); long t1 = s1.Ticks

据我所知,
DateTime
TimeSpan
结构的二进制表示是8字节的刻度(根据
TimeSpan.TicksPerSecond
,1毫秒=10000个刻度)。以及天、小时、分钟等的值。属性通过整数除法在
TicksPerDay
TicksPerHour
TicksPerSecond
等时间跨度的常数获得

例如,如果运行此代码:

TimeSpan s1     = new TimeSpan(3, 5, 7, 9, 11).AddTicks(13));
long t1         = s1.Ticks;
您可以在内存窗口中获得(如果使用Visual Studio)类似的内容:

0x061BE4D0 3d 2a c9 67 86 02 00
0x061BE4E0 3d 2a c9 67 86 02 00
其中
0x061BE4D0
0x061BE4E0
分别是
s1
t1
的地址。 (实际上,您应该在内存窗口的地址区域中写入“
s1
”和“
&t1
”,而不仅仅是“
t1
”)

现在,如果运行另一段代码:

DateTime d1     = new DateTime(1, 1, 3, 5, 7, 9, 11).AddTicks(13);
long t1         = d1.Ticks;

DateTime d2     = DateTime.Now;
long t2         = d2.Ticks;
您将分别看到“
d1
”、“
&t1
”、“
d2
”、“
&t2
”的数据,如图所示:

0x061AE438 3d 6a 5f 3d bd 01 00
0x061AE430 3d 6a 5f 3d bd 01 00
0x061AE424 bd 71 d5 02 3f 9d d0 88
0x061AE41C bd 71 d5 02 3f 9d d0 08

为什么
DateTime.Now
在其二进制表示形式中设置最高位(0x 80 00 00)?

如果您查看此处的源代码(不确定这是哪个版本,但您知道):

您可以看到,高位的应用取决于时间是否为本地时间

快速浏览一下代码,有一个const成员称为:

private const UInt64 KindLocal             = 0x8000000000000000; 
这看起来像是在转换中使用的。我怀疑这是因为你使用了DateTime.Now,这是一个本地的“Now”。如果使用“UtcNow”,可能会设置不同的位

private const UInt64 KindUtc             = 0x4000000000000000; 
但是,当您将其作为“ticks”时,它可能会返回未指定的表单,该表单没有顶部位集

private const UInt64 KindUnspecified       = 0x0000000000000000; 

基本上,您会被结构的内部工作挂起。如果你真的想理解它,那么我建议你仔细研究一下代码。否则,只需按照说明使用它,它就会很好地为您服务

最高位在我看来是零:您使用
&t2
查看的是
t2
的地址,而不是值。什么的最高位?-DateTime.Now还是DateTime.Now.Ticks?是的,我知道,这很奇怪,但当你刚刚放下't2'时,它会显示奇怪的字节。如果你不相信我(使用VS2012),你必须试着自己重复同样的步骤,看看这是否奇怪,但这是因为DateTime。与你的时间跨度相比,现在有很多刻度。你的时间跨度只有几天,但现在有2013年的滴答声,计算一下它有多少秒,它有多少滴答声。还有第四种——但它是隐藏的:@Jon:很棒的文章,谢谢你的帖子。这是一个有趣的问题,并促使我深入研究了一种我以前从未研究过的类型的代码:)(顺便说一句,几天前刚收到你的书。非常喜欢。)谢谢!你完全回答了我的问题question@Baldrick,我问这个问题是因为我需要字节[]、日期时间、时间跨度的一些扩展方法:GetTimeSpan()、GetBytes()、GetDateTime()、GetBytes()。我意识到他们是这样的:-现在我使用0x3fffffffffffffffff而不是0x7fFFffFFffFFffFF