これがCでどのように計算されるか知っている人はいますか?
uint8_t samplerate = 200;
uint8_t Result;
Result = 0.5 * samplerate;
さて、問題は0.5が浮動小数点数とsamplerate
整数であるということです。Result
0.5は整数に変換されるため、0(Result = 0 * 200 = 0
)に丸められるため、0のいずれかになります。またはResult
、コンパイラが最初に0.5を認識samplerate
し、float(Result = 0.5 * 200 = 100
)に変換するため、100になる可能性があります。
コンパイラがこれらの計算を処理する方法は標準化されていますか?つまり、コンパイラは最初に左端(この場合は0.5)の変数を調べて、もう一方をこれに変換しますか、それとも右端(samplerate
)の変数を調べて、他の変数をこれに変換しますか?
私はこの問題をどのように解決できるかを知っていますが、これがC標準化されている場合、一般的な答えを探し、そのような方程式をどのように計算しますか?
さまざまなタイプの数値を式で組み合わせると、通常の算術変換が行われます。これは、どのオペランドをどのタイプに変換するかを指示する一連のルールです。
これらの変換は、C標準のセクション6.3.1.8で詳しく説明されています。
算術型のオペランドを期待する多くの演算子は、同様の方法で変換を引き起こし、結果型を生成します。目的は、オペランドと結果の共通の実数型を決定することです。指定されたオペランドについて、各オペランドは、型ドメインを変更せずに、対応する実数型が共通実数型である型に変換されます。特に明記されていない限り、共通の実数型は、結果の対応する実数型でもあります。その型ドメインは、オペランドが同じ場合はオペランドの型ドメインであり、それ以外の場合は複素数です。このパターンは、通常の算術変換と呼ばれます。
- まず、いずれかのオペランドの対応する実数型がlong doubleの場合、もう一方のオペランドは、型ドメインを変更せずに、対応する実数型がlongdoubleの型に変換されます。
- それ以外の場合、いずれかのオペランドの対応する実数型がdoubleの場合、もう一方のオペランドは、型ドメインを変更せずに、対応する実数型がdoubleである型に変換されます。
- それ以外の場合、いずれかのオペランドの対応する実数型がfloatの場合、もう一方のオペランドは、型ドメインを変更せずに、対応する実数型がfloatである型に変換されます。
- それ以外の場合、整数昇格は両方のオペランドで実行されます。次に、プロモートされたオペランドに次のルールが適用されます。
- 両方のオペランドのタイプが同じである場合、それ以上の変換は必要ありません。
- それ以外の場合、両方のオペランドが符号付き整数型であるか、両方が符号なし整数型である場合、整数変換ランクが小さい方のオペランドは、ランクが大きい方のオペランドの型に変換されます。
- それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上の場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。
- それ以外の場合、符号付き整数型のオペランドの型が符号なし整数型のオペランドの型のすべての値を表すことができる場合、符号なし整数型のオペランドは符号付き整数型のオペランドの型に変換されます。
- それ以外の場合、両方のオペランドは、符号付き整数型のオペランドの型に対応する符号なし整数型に変換されます。
特に太字の段落に注意してください。これがあなたのケースに当てはまります。
浮動小数点定数0.5
は型を持っているdouble
ので、他のオペランドの値は型double
に変換され、乗算演算子の結果*
は型を持ちdouble
ます。次に、この結果はタイプの変数に割り当てられるuint8_t
ため、double
値は割り当てのためにこのタイプに変換されます。
したがって、この場合Result
、値は100になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加