前回/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>
なるほど。なんとなくわかった気になりました。
コメント