unsigned int r0,r1,r2,r3;
r2=r0+9;
r3=r0+3;
r1=r0+r0;
do
{
r1=r1+1;
r3=r0+(r3<<1);
r2=r2-r1;
} while(r2!=r1);
ループ内で r0 が何を行っているのかわからないことは、数回または何度も発生する可能性があります (数百万? 数十億?) r2 は減少し、r1 は増加します。最初に通過するときに等しいものと衝突しない場合、ロールアラウンドする必要があります。すべてのループ r1 が大きくなるので、r2 はより速く小さくなります。printf と r0 のいくつかのテスト値を追加して、何が起こるかを確認するのは非常に簡単です。
たとえば、このコードを入力する前に r0 が 0 であるとします。r2 は r0+9 = 9; r1 は double の r0 であり、0 です。
最初の非常に多くのループは、4 つの変数 r0、r1、r2、r3 を使用して次のようになります。
00000000 00000001 00000008 00000006
00000000 00000002 00000007 0000000C
00000000 00000003 00000006 00000018
00000000 00000004 00000005 00000030
00000000 00000005 00000004 00000060
00000000 00000006 00000003 000000C0
00000000 00000007 00000002 00000180
00000000 00000008 00000001 00000300
00000000 00000009 00000000 00000600
00000000 0000000A FFFFFFFF 00000C00
00000000 0000000B FFFFFFFE 00001800
r2 と r1 は衝突しません。
しかし、r0 が 1 だった場合は、
00000001 00000003 00000009 00000009
00000001 00000004 00000008 00000013
00000001 00000005 00000007 00000027
00000001 00000006 00000006 0000004F
r0 = 3
00000003 00000007 0000000B 0000000F
00000003 00000008 0000000A 00000021
00000003 00000009 00000009 00000045
ここまでは、r0 が奇数である必要があります。しかし、r0 を 9 にすると、
00000009 00000013 00000011 00000021
00000009 00000014 00000010 0000004B
00000009 00000015 0000000F 0000009F
00000009 00000016 0000000E 00000147
00000009 00000017 0000000D 00000297
00000009 00000018 0000000C 00000537
00000009 00000019 0000000B 00000A77
00000009 0000001A 0000000A 000014F7
00000009 0000001B 00000009 000029F7
00000009 0000001C 00000008 000053F7
00000009 0000001D 00000007 0000A7F7
00000009 0000001E 00000006 00014FF7
00000009 0000001F 00000005 00029FF7
00000009 00000020 00000004 00053FF7
00000009 00000021 00000003 000A7FF7
00000009 00000022 00000002 0014FFF7
00000009 00000023 00000001 0029FFF7
00000009 00000024 00000000 0053FFF7
00000009 00000025 FFFFFFFF 00A7FFF7
00000009 00000026 FFFFFFFE 014FFFF7
基本的に、いくつかのルールでは少し決定論的ですが、比較が行われない場合、ループは永遠に実行されるか、少なくとも多くのサイクルが実行される可能性があります。