Main Content

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 ビットの符号付き整数の範囲は 2n12n11 で、両端を含みます。n ビットの符号なし整数の範囲は、0 ~ 2n1 で、両端を含みます。この範囲の負の側は正の側より 1 つ値が多く、ゼロは一意に表現されています。

整数データ型最小値最大値

signed char

–128

127

unsigned char

0

255

short int

–32,768

32,767

unsigned short

0

65,535

int

–32,768

32,767

unsigned int

0

65,535

long int

–2,147,483,648

2,147,483,647

unsigned long

0

4,294,967,295

fi 整数データ型

次の表は、fi オブジェクトの整数データ型の数値範囲で、特に C 整数データ型に相当するものを示しています。範囲は 2 の補数表現に対応するのに十分な大きさで、これは Fixed-Point Designer™ ソフトウェアが唯一サポートしている符号付きバイナリ エンコード方法です。

コンストラクター符号付き語長小数部の長さ最小値最大値ANSI C で最も近い型

fi(x,1,n,0)

はい

n
(2 ~ 65,535)

0

2n1

2n11

該当なし

fi(x,0,n,0)

いいえ

n
(2 ~ 65,535)

0

0

2n1

該当なし

fi(x,1,8,0)

はい

8

0

–128

127

signed char

fi(x,0,8,0)

いいえ

8

0

0

255

unsigned char

fi(x,1,16,0)

はい

16

0

–32,768

32,767

short int

fi(x,0,16,0)

いいえ

16

0

0

65,535

unsigned short

fi(x,1,32,0)

はい

32

0

–2,147,483,648

2,147,483,647

long int

fi(x,0,32,0)

いいえ

32

0

0

4,294,967,295

unsigned long

単項変換

単項変換は、演算が実行される前に、1 つのオペランドが変換されるかどうかとその方法を決定します。この節では、ANSI C での単項変換と fi オブジェクトの単項変換について説明します。

ANSI C 通常単項変換

ANSI C の単項変換は次の表に従って、単項演算子 !、–、~、* の各オペランドと、二項演算子 << および>> のオペランドに自動的に適用されます。

元のオペランドの型ANSI C 変換

char または short

int

unsigned char または unsigned short

int または unsigned int1

float

float

T の配列

T へのポインター

T を返す関数

T を返す関数へのポインター

1int 型がオーバーフローなしに元のデータ型の値をすべて表現できない場合、変換後の型は unsigned int になります。

fi 通常単項変換

次の表は、fi 単項変換を示しています。

C 演算子等価の fi 演算子fi 変換

!x

~x = not(x)

結果は logical です。

~x

bitcmp(x)

結果はオペランドと同じ数値型です。

*x

等価はなし

該当なし

x<<n

bitshift(x,n)
正の n

結果はオペランドと同じ数値型です。丸めモードは常に floor です。オーバーフロー モードに従います。0 の値のビットが右にシフトします。

x>>n

bitshift(x,-n)

結果はオペランドと同じ数値型です。丸めモードは常に floor です。オーバーフロー モードに従います。オペランドが符号なしか、符号付きで正の場合は、0 の値のビットが左にシフトします。オペランドが符号付きで負の場合は、1 の値のビットが左にシフトします。

+x

+x

結果はオペランドと同じ数値型です。

-x

-x

結果はオペランドと同じ数値型です。オーバーフロー モードに従います。たとえば、符号なし fi、または符号付き fi の負の最大値を無効にすると、オーバーフローが発生する可能性があります。

二項変換

この節では、二項演算子のオペランドのデータ型が異なる場合に発生する変換について説明します。

ANSI C 通常二項変換

ANSI C では、二項演算子のオペランドが同じ型でなければなりません。異なる場合は、次の表の最初に適用可能な変換に従って、一方が他方の型に変換されます。

一方のオペランドの型他方のオペランドの型ANSI C 変換

long double

任意

long double

double

任意

double

float

任意

float

unsigned long

任意

unsigned long

long

unsigned

long または unsigned long1

long

int

long

unsigned

int または unsigned

unsigned

int

int

int

1long 型は unsigned 型のすべての値を表現できる場合にのみ使用されます。

fi 通常二項変換

二項演算子 (+、–、*.*) のオペランドの一方が fi オブジェクトで、他方が MATLAB® 組み込み数値型の場合は、演算が実行される前に、次の表に従って fi でないオペランドが fi オブジェクトに変換されます。

一方のオペランドの型他方のオペランドの型fi オブジェクトに変換された他方のオペランドのプロパティ

fi

double or single

  • Signed = 元の fi オペランドと同じ

  • WordLength = 元の fi オペランドと同じ

  • FractionLength = 最大精度に設定

fi

int8

  • Signed = 1

  • WordLength = 8

  • FractionLength = 0

fi

uint8

  • Signed = 0

  • WordLength = 8

  • FractionLength = 0

fi

int16

  • Signed = 1

  • WordLength = 16

  • FractionLength = 0

fi

uint16

  • Signed = 0

  • WordLength = 16

  • FractionLength = 0

fi

int32

  • Signed = 1

  • WordLength = 32

  • FractionLength = 0

fi

uint32

  • Signed = 0

  • WordLength = 32

  • FractionLength = 0

fi

int64

  • Signed = 1

  • WordLength = 64

  • FractionLength = 0

fi

uint64

  • Signed = 0

  • WordLength = 64

  • FractionLength = 0

オーバーフローの処理

以下の節では、ANSI C と Fixed-Point Designer ソフトウェアがオーバーフローを処理する方法を比較します。

ANSI C のオーバーフローの処理

ANSI C での符号付き整数の演算結果は、演算を実行したマシンの命令によって生成された値です。したがって、ANSI C には符号付き整数のオーバーフローを処理するルールがありません。

符号なしの整数のオーバーフローの結果は ANSI C ではラップします。

fi のオーバーフローの処理

fi オブジェクトを使用した加算と乗算によって生成される結果は、最大 65,535 ビットの語長またはマシンで使用可能なメモリまで、fi オブジェクトで正確に表現できます。ただし、除算の場合は、多くの比率の結果が無限の二項式になるため、これとは異なります。fi オブジェクトの除算は関数 divide を使用して実行できます。その場合、結果の数値型を明示的に指定する必要があります。

fi オブジェクトがオーバーフローする条件と、生成される結果は、関連付けられた fimath オブジェクトによって決まります。オーバーフローの一部の特性は、加算 (差異を含む) と乗算に別々に指定できます。次の表を参照してください。

オーバーフローの処理に関連する fimath オブジェクトのプロパティプロパティ値説明

OverflowAction

'saturate'

オーバーフローは範囲の最大値または最小値に飽和されます。

'wrap'

オーバーフローは、符号なしの場合はモジュロ演算を使用してラップし、符号付きの場合は 2 の補数がラップします。

ProductMode

'FullPrecision'

最大精度の結果が維持されます。オーバーフローは発生しません。最終的な語長が MaxProductWordLength を超える場合は、エラーがスローされます。

結果の乗算の語長と小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。

 

'KeepLSB'

乗算の最下位ビットが維持されます。完全精度が維持されますが、オーバーフローが発生する可能性もあります。この動作は C 言語の整数演算をモデル化します。

ProductWordLength プロパティにより最終的な語長が決定されます。ProductWordLength が最大精度の積に必要な長さを超える場合、結果は最下位ビットに格納されます。ProductWordLength が最大精度の積に必要な長さに満たない場合は、オーバーフローが発生します。

結果の乗算の小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。

 

'KeepMSB'

乗算の最上位ビットが維持されます。オーバーフローは回避されますが、精度が低下する可能性があります。

ProductWordLength プロパティにより最終的な語長が決定されます。ProductWordLength が最大精度の積に必要な長さを超える場合、結果は最上位ビットに格納されます。ProductWordLength が最大精度の積に必要な長さに満たない場合は、丸めが発生します。

結果の乗算の小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。

 

'SpecifyPrecision'

結果の乗算の語長と小数部の長さを指定できます。

ProductWordLength

正の整数

ProductMode'KeepLSB''KeepMSB'、または 'SpecifyPrecision' のとき乗算の結果の語長。

MaxProductWordLength

正の整数

ProductMode'FullPrecision' のときに許可される乗算の最大語長。既定の設定は 65,535 ビットです。このプロパティは、シミュレーションがハードウェア要件を超えないようにします。

ProductFractionLength

整数

ProductMode'Specify Precision' のとき乗算の結果の小数部の長さ。

SumMode

'FullPrecision'

最大精度の結果が維持されます。オーバーフローは発生しません。最終的な語長が MaxSumWordLength を超える場合は、エラーがスローされます。

結果の加算の語長と小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。

 

'KeepLSB'

加算の最下位ビットが維持されます。完全精度が維持されますが、オーバーフローが発生する可能性もあります。この動作は C 言語の整数演算をモデル化します。

SumWordLength プロパティにより最終的な語長が決定されます。SumWordLength が最大精度の和に必要な長さを超える場合、結果は最下位ビットに格納されます。SumWordLength が最大精度の和に必要な長さに満たない場合は、オーバーフローが発生します。

結果の加算の小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。

 

'KeepMSB'

加算の最上位ビットが維持されます。オーバーフローは回避されますが、精度が低下する可能性があります。

SumWordLength プロパティにより最終的な語長が決定されます。SumWordLength が最大精度の和に必要な長さを超える場合、結果は最上位ビットに格納されます。SumWordLength が最大精度の和に必要な長さに満たない場合は、丸めが発生します。

結果の加算の小数部の長さを計算するルールは、「プロパティ リファレンス」のfimath オブジェクト プロパティに記載されています。

 

'SpecifyPrecision'

結果の加算の語長と小数部の長さを指定できます。

SumWordLength

正の整数

SumMode'KeepLSB''KeepMSB'、または 'SpecifyPrecision' のとき加算の結果の語長。

MaxSumWordLength

正の整数

SumMode'FullPrecision' のときに許可される加算の最大語長。既定の設定は 65,535 ビットです。このプロパティは、シミュレーションがハードウェア要件を超えないようにします。

SumFractionLength

整数

SumMode'SpecifyPrecision' のとき加算の結果の小数部の長さ。