Windowsコマンド(w32tm ntpte)

前回/ntpteで1を指定して実行したら、よくわからない結果になりました。

C:\Users\takk>w32tm /ntpte 1
0x014FCFD27DE04000 - 109401 04:20:16.0000000 - 1900/07/14 13:20:16

C:\Users\takk>

16進数ってのも良くわかりません。もしかしたら浮動小数点数なんでしょうか。

浮動小数点の16進を求めるプログラムを作って確認。

takk@DESKTOP-GQ56KQL:~$ cat -n test.c
     1  #include <stdio.h>
     2
     3  int main()
     4  {
     5          double a = 1;
     6
     7          printf("%f \n",a);
     8          printf("%llx \n",*(long long*)&a);
     9
    10  }
takk@DESKTOP-GQ56KQL:~$

64bit浮動小数点数の1は、16進でいくつになるのでしょうか。

takk@DESKTOP-GQ56KQL:~$ gcc test.c
takk@DESKTOP-GQ56KQL:~$ ./a.out
1.000000
3ff0000000000000
takk@DESKTOP-GQ56KQL:~$

3ff0000000000000のようです。0の数が、13個です。

指定してみます。

C:\Users\takk>w32tm /ntpte 0x3ff0000000000000
0x014F373BFDE0408F - 109207 00:00:00.0000143 - 1900/01/01 9:00:00

C:\Users\takk>

まったくわけが分かりません。
浮動小数点のフォーマットが違うのでしょうか。
4桁ほど、0を少なくしてみます。

C:\Users\takk>w32tm /ntpte 0x3ff000000000
0x014F373BFE6F72A5 - 109207 00:00:00.9384613 - 1900/01/01 9:00:00

C:\Users\takk>

もう1桁、減らしてみます。

C:\Users\takk>w32tm /ntpte 0x3ff00000000
0x014F373BFE783FB3 - 109207 00:00:00.9961395 - 1900/01/01 9:00:00

C:\Users\takk>

1に近づいてきました。
数字をこねくり回して、もっと1秒に近づけたいと思います。

C:\Users\takk>w32tm /ntpte 0x3fff00000000
0x014F373BFE786377 - 109207 00:00:00.9970551 - 1900/01/01 9:00:00

C:\Users\takk>w32tm /ntpte 0x4fff00000000
0x014F373BFE786D00 - 109207 00:00:00.9972992 - 1900/01/01 9:00:00

C:\Users\takk>w32tm /ntpte 0x5fff00000000
0x014F373BFE787689 - 109207 00:00:00.9975433 - 1900/01/01 9:00:00

C:\Users\takk>w32tm /ntpte 0xffff00000000
0x014F373BFE78D5E7 - 109207 00:00:00.9999847 - 1900/01/01 9:00:00

C:\Users\takk>w32tm /ntpte 0xfffff00000000
0x014F373BFE78D5F0 - 109207 00:00:00.9999856 - 1900/01/01 9:00:00

C:\Users\takk>w32tm /ntpte 0xffffffff00000000
0x014F373BFE78D680 - 109207 00:00:01.0000000 - 1900/01/01 9:00:01

C:\Users\takk>

できた。できました。だから何だ、ですけど。

さらに追い込んでみます。

C:\Users\takk>w32tm /ntpte 0xffffffff10000000
0x014F373C08023E80 - 109207 00:00:17.0000000 - 1900/01/01 9:00:17

C:\Users\takk>

なんと、17倍になりました。

C:\Users\takk>w32tm /ntpte 0xffffffff20000000
0x014F373C118BA680 - 109207 00:00:33.0000000 - 1900/01/01 9:00:33

C:\Users\takk>

2にすると、さらに2倍。
ってことは、一個右のbitを操作すると、

C:\Users\takk>w32tm /ntpte 0xffffffff08000000
0x014F373C033D8A80 - 109207 00:00:09.0000000 - 1900/01/01 9:00:09

C:\Users\takk>w32tm /ntpte 0xffffffff08000000
0x014F373C033D8A80 - 109207 00:00:09.0000000 - 1900/01/01 9:00:09

C:\Users\takk>w32tm /ntpte 0xffffffff04000000
0x014F373C00DB3080 - 109207 00:00:05.0000000 - 1900/01/01 9:00:05

C:\Users\takk>w32tm /ntpte 0xffffffff02000000
0x014F373BFFAA0380 - 109207 00:00:03.0000000 - 1900/01/01 9:00:03

C:\Users\takk>w32tm /ntpte 0xffffffff01000000
0x014F373BFF116D00 - 109207 00:00:02.0000000 - 1900/01/01 9:00:02

C:\Users\takk>

って、ことは。

C:\Users\takk>w32tm /ntpte 0x0000000001000000
0x014F373BFE78D680 - 109207 00:00:01.0000000 - 1900/01/01 9:00:01

C:\Users\takk>

このbitで秒指定できるのですね。
じゃあ、1分(60秒)を指定する場合は、0x3cを指定してやればよいので、

C:\Users\takk>w32tm /ntpte 0x000000003c000000
0x014F373C21A38600 - 109207 00:01:00.0000000 - 1900/01/01 9:01:00

C:\Users\takk>

なるほど。なんとなくわかった気になりました。

コメント

タイトルとURLをコピーしました