あなたがしたいのはモジュラー算術です。あなたの 2 の補数マシンは、すでに整数演算でこれを行っています。したがって、値を 2 の補数演算にマッピングすることで、modolo 操作を解放できます。
トリックは、角度を 0 から 1 イプシロンの間の 360 度の分数として表すことです。もちろん、一定の角度も同様に表現する必要がありますが、それは難しいことではありません。これは、変換関数 (er、マクロ) に隠すことができるちょっとした数学です。
このアイデアの価値は、角度を足したり引いたりすると、必要な分数部分と捨てたい整数部分を持つ値が得られるということです。分数を 2^32 の 2 進小数点を持つ 32 ビットの固定小数点数として表す場合 (たとえば、通常は符号ビットと見なされるものの左側)、分数のオーバーフローは単純に先頭から外れます。無料で32ビット値。したがって、すべての整数計算を行うと、「オーバーフロー」の除去が無料で行われます。
だから私はあなたのコードを書き直します(度×10の考え方を維持します):
typedef unsigned int32 angle; // angle*3600/(2^32) represents degrees
#define angle_scale_factor 1193046.47111111 // = 2^32/3600
#define make_angle(degrees) (unsigned int32)((degrees%3600)*angle_scale_factor )
#define make_degrees(angle) (angle/(angle_scale_factor*10)) // produces float number
...
angle a = make_angle(100); // compiler presumably does compile-time math to compute 119304647
angle b = make_angle(200); // = 238609294
angle c = a - b; // compiler should generate integer subtract, which computes 4175662649
#if 0 // no need for this at all; other solutions execute real code to do something here
if (c < 0) // this can't happen
{ c += 3600; } // this is the wrong representation for our variant
#endif
// speed doesn't matter here, we're doing output:
printf("final angle %f4.2 = \n", make_degrees(c)); // should print 350.00
このコードをコンパイルして実行していません。
この角度を 100 倍または 1 倍にする変更は非常に簡単です。angle_scale_factor を変更します。16 ビット マシンを使用している場合、16 ビットへの切り替えも同様に簡単です。32 ビットがあり、それでも 16 ビット演算のみを実行したい場合は、出力する値を 16 ビットにマスクする必要があります。
このソリューションには、もう 1 つの優れたプロパティがあります。どの変数が角度であるかを文書化しました (そして面白い表現を持っています)。OP の元のコードでは単に int と呼ばれていましたが、それはそれらが表すものではありません。将来の保守担当者は、特に減算が変数から分離されていることに気付いた場合、元のコードに驚かれることでしょう。