3

unsigned char を使用する場合、いつオーバーフローを心配する必要があるかわかりません。この場合は明らかです。

uint8_t a = 3;
uint8_t b = 6;
uint8_t c = a - b; // c is 253 

ただし、ここで何が起こるか:

float d = a - b; // d is -3

減算を行う前に a と float の両方を float に変換しますか?

または、この場合も:

float e = (a - b) + (a - c);

3 つの変数はすべて float に変換されていますか?

割り当てられている変数が float であっても、オーバーフローが発生する可能性はありますか? eがfloat、int、またはその他の場合、ルールは同じですか?

また、次のような場合はどうなりますか。

int a = std::abs(a - b);
4

1 に答える 1

7

あなたのケースは、char から float への変換の結果ではありませんが、整数昇格規則によるものです。 Cppreferenceは次のように述べています(強調は私のものです):

小さな整数型 (char など) の prvalue は、より大きな整数型 (int など) の prvalue に変換できます。特に、算術演算子は int より小さい型を引数として受け入れず、該当する場合、左辺値から右辺値への変換後に整数昇格が自動的に適用されます。この変換では、常に値が保持されます。

と:

unsigned char または unsigned short は、値の範囲全体を保持できる場合は int に変換でき、そうでない場合は unsigned int に変換できます。

したがって、あなたの場合、-演算子は値を整数に変換し、次に浮動小数点数に変換します。への代入のみが(オーバーフローする) ca に変換されます。uint8_t

同じことが例にも当てはまりますstd::abs。値は減算の前に変換され、結果が関数に渡されます。

算術演算の符号付き/符号なしプロモーションの詳細については、たとえば次の回答を参照してください: https://stackoverflow.com/a/6770275/3198247

于 2015-08-06T11:49:10.793 に答える