そのため、フィールドの問題があり、何日もデバッグした後、問題をこの特定のコードに絞り込みました。ここでは、while ループの処理が行われていませんでした。
// heavily redacted code
// numberA and numberB are both of uint16_t
// Important stuff happens in that while loop
while ( numberA + 1 == numberB )
{
// some processing
}
numberA + 1
uint16 の制限である 65535 に達するまで、これは問題なく実行されていました。後で別の一連の print ステートメントを実行したところ、値が であることが65536
わかりましnumberB
た0
。これはチェックに失敗し、処理は行われませんでした。
これが気になったので、これを確認するために簡単な C プログラム (GCC 4.9.2 でコンパイル) を作成しました。
#include <stdio.h>
#include <stdint.h>
int main()
{
uint16_t numberA, numberB;
numberA = 65535;
numberB = numberA + 1;
uint32_t numberC, numberD;
numberC = 4294967295;
numberD = numberC + 1;
printf("numberA = %d\n", numberA + 1);
printf("numberB = %d\n", numberB);
printf("numberC = %d\n", numberC + 1);
printf("numberD = %d\n", numberD);
return 0;
}
結果は次のとおりです。
numberA = 65536
numberB = 0
numberC = 0
numberD = 0
そのため、 の結果がnumberA + 1
uint32_t に昇格されたようです。これはC言語が意図したものですか?それとも、これはコンパイラ/ハードウェアの奇妙さですか?