fi オブジェクトと C 整数データ型
メモ
このトピックの各節では、fi
オブジェクトを C の固定小数点データ型および演算と比較します。ANSI® C に関する情報は Samuel P. Harbison および Guy L. Steele Jr., C: A Reference Manual, 3rd ed., Prentice Hall, 1991 から引用したものです。
整数データ型
この節では、2 の補数の表現を想定し、fi
整数データ型の数値範囲を C 整数データ型の最小数値範囲と比較します。
C 整数データ型
C コンパイラの多くは、符号付き整数データ型の 2 の補数表現をサポートしています。次の表は、2 の補数表現を使った C 整数データ型の最小範囲を示しています。整数範囲はこの範囲以上にすることができますが、小さくすることはできません。long
の範囲は int
の範囲以上でなければならず、int は short
の範囲以上でなければなりません。
2 の補数表現では、n ビットの符号付き整数の範囲は ~ で、両端を含みます。n ビットの符号なし整数の範囲は、0 ~ で、両端を含みます。この範囲の負の側は正の側より 1 つ値が多く、ゼロは一意に表現されています。
整数データ型 | 最小値 | 最大値 |
---|---|---|
| –128 | 127 |
| 0 | 255 |
| –32,768 | 32,767 |
| 0 | 65,535 |
| –32,768 | 32,767 |
| 0 | 65,535 |
| –2,147,483,648 | 2,147,483,647 |
| 0 | 4,294,967,295 |
fi 整数データ型
次の表は、fi
オブジェクトの整数データ型の数値範囲で、特に C 整数データ型に相当するものを示しています。範囲は 2 の補数表現に対応するのに十分な大きさで、これは Fixed-Point Designer™ ソフトウェアが唯一サポートしている符号付きバイナリ エンコード方法です。
コンストラクター | 符号付き | 語長 | 小数部の長さ | 最小値 | 最大値 | ANSI C で最も近い型 |
---|---|---|---|---|---|---|
| はい | n | 0 | 該当なし | ||
| いいえ | n | 0 | 0 | 該当なし | |
| はい | 8 | 0 | –128 | 127 |
|
| いいえ | 8 | 0 | 0 | 255 |
|
| はい | 16 | 0 | –32,768 | 32,767 |
|
| いいえ | 16 | 0 | 0 | 65,535 |
|
| はい | 32 | 0 | –2,147,483,648 | 2,147,483,647 |
|
| いいえ | 32 | 0 | 0 | 4,294,967,295 |
|
単項変換
単項変換は、演算が実行される前に、1 つのオペランドが変換されるかどうかとその方法を決定します。この節では、ANSI C での単項変換と fi
オブジェクトの単項変換について説明します。
ANSI C 通常単項変換
ANSI C の単項変換は次の表に従って、単項演算子 !
、–、~、*
の各オペランドと、二項演算子 <<
および>>
のオペランドに自動的に適用されます。
元のオペランドの型 | ANSI C 変換 |
---|---|
|
|
|
|
|
|
T の配列 | T へのポインター |
T を返す関数 | T を返す関数へのポインター |
1int
型がオーバーフローなしに元のデータ型の値をすべて表現できない場合、変換後の型は unsigned int
になります。
fi 通常単項変換
次の表は、fi
単項変換を示しています。
C 演算子 | 等価の fi 演算子 | fi 変換 |
---|---|---|
| ~ | 結果は |
~ |
| 結果はオペランドと同じ数値型です。 |
| 等価はなし | 該当なし |
|
| 結果はオペランドと同じ数値型です。丸めモードは常に |
|
| 結果はオペランドと同じ数値型です。丸めモードは常に |
|
| 結果はオペランドと同じ数値型です。 |
|
| 結果はオペランドと同じ数値型です。オーバーフロー モードに従います。たとえば、符号なし |
二項変換
この節では、二項演算子のオペランドのデータ型が異なる場合に発生する変換について説明します。
ANSI C 通常二項変換
ANSI C では、二項演算子のオペランドが同じ型でなければなりません。異なる場合は、次の表の最初に適用可能な変換に従って、一方が他方の型に変換されます。
一方のオペランドの型 | 他方のオペランドの型 | ANSI C 変換 |
---|---|---|
| 任意 |
|
| 任意 |
|
| 任意 |
|
| 任意 |
|
|
|
|
|
|
|
|
|
|
|
|
|
1long
型は unsigned
型のすべての値を表現できる場合にのみ使用されます。
fi 通常二項変換
二項演算子 (+
、–、*
、.*
) のオペランドの一方が fi
オブジェクトで、他方が MATLAB® 組み込み数値型の場合は、演算が実行される前に、次の表に従って fi
でないオペランドが fi
オブジェクトに変換されます。
一方のオペランドの型 | 他方のオペランドの型 | fi オブジェクトに変換された他方のオペランドのプロパティ |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
オーバーフローの処理
以下の節では、ANSI C と Fixed-Point Designer ソフトウェアがオーバーフローを処理する方法を比較します。
ANSI C のオーバーフローの処理
ANSI C での符号付き整数の演算結果は、演算を実行したマシンの命令によって生成された値です。したがって、ANSI C には符号付き整数のオーバーフローを処理するルールがありません。
符号なしの整数のオーバーフローの結果は ANSI C ではラップします。
fi のオーバーフローの処理
fi
オブジェクトを使用した加算と乗算によって生成される結果は、最大 65,535 ビットの語長またはマシンで使用可能なメモリまで、fi
オブジェクトで正確に表現できます。ただし、除算の場合は、多くの比率の結果が無限の二項式になるため、これとは異なります。fi
オブジェクトの除算は関数 divide
を使用して実行できます。その場合、結果の数値型を明示的に指定する必要があります。
fi
オブジェクトがオーバーフローする条件と、生成される結果は、関連付けられた fimath
オブジェクトによって決まります。オーバーフローの一部の特性は、加算 (差異を含む) と乗算に別々に指定できます。次の表を参照してください。
オーバーフローの処理に関連する fimath オブジェクトのプロパティ | プロパティ値 | 説明 |
---|---|---|
|
| オーバーフローは範囲の最大値または最小値に飽和されます。 |
| オーバーフローは、符号なしの場合はモジュロ演算を使用してラップし、符号付きの場合は 2 の補数がラップします。 | |
|
| 最大精度の結果が維持されます。オーバーフローは発生しません。最終的な語長が 結果の乗算の語長と小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。 |
| 乗算の最下位ビットが維持されます。完全精度が維持されますが、オーバーフローが発生する可能性もあります。この動作は C 言語の整数演算をモデル化します。
結果の乗算の小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。 | |
| 乗算の最上位ビットが維持されます。オーバーフローは回避されますが、精度が低下する可能性があります。
結果の乗算の小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。 | |
| 結果の乗算の語長と小数部の長さを指定できます。 | |
| 正の整数 |
|
| 正の整数 |
|
| 整数 |
|
|
| 最大精度の結果が維持されます。オーバーフローは発生しません。最終的な語長が 結果の加算の語長と小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。 |
| 加算の最下位ビットが維持されます。完全精度が維持されますが、オーバーフローが発生する可能性もあります。この動作は C 言語の整数演算をモデル化します。
結果の加算の小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。 | |
| 加算の最上位ビットが維持されます。オーバーフローは回避されますが、精度が低下する可能性があります。
結果の加算の小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。 | |
| 結果の加算の語長と小数部の長さを指定できます。 | |
| 正の整数 |
|
| 正の整数 |
|
| 整数 |
|