11.3 ARM C および C++ での基本データ型の演算

ARM C および C++ での基本データ型の算術演算の実装の詳細について説明します。

ARM コンパイラでは、ISO C99 標準および ISO C++ 標準の関連セクションで定義されている通常の算術変換を実行します。以下では、算術演算に関する補足事項について説明します。

整数型の演算

整数型の演算には以下の規則が適用されます。
  • すべての符号付き整数演算には、2 の補数表現が使用されます。
  • 符号付き整数型のビットごとの演算は、2 の補数表現から自然に生じる規則に従います。符号拡張は行われません。
  • 符号付き数値の右シフトは算術演算です。
  • int 型の値の場合、
    • 0 ~ 127 の範囲外のシフトは定義されません。
    • 31 を超える左シフトが行われると、ゼロが返されます。
    • 31 を超える右シフトが行われる場合、符号なし値または正の符号付き値のシフトではゼロが返されます。負の符号付き値でこのようなシフトを行うと、–1 が返されます。
  • long long 型の値の場合、0 ~ 63 の範囲外のシフトは定義されません。
  • 整数除算の剰余の符号は、ISO C99 標準で規定されている分子の符号と同じです。
  • 整数型の値が短い符号付き整数型に切り捨てられる場合は、適切な数の最上位ビットを破棄することで結果が求められます。そのため、元の数が大きすぎると、値の正負にかかわらず、結果の符号と元の符号が同じにならないことがあります。
  • 整数型同士の変換では例外は発生しません。
  • 整数のオーバーフローでは例外は発生しません。
  • ゼロによる整数除算では、デフォルトでは 0 が返されます。

浮動小数点型の演算

浮動小数点型の演算には、以下の特徴があります。
  • 通常の IEEE 754 の規則が適用されます。
  • デフォルトでは、最も近い表現可能な値に丸められます。
  • デフォルトでは、浮動小数点例外はディセーブルになっています。

浮動小数点の処理に関する IEEE 754 標準では、例外に対するデフォルトのアクションとしてトラップなしで続行することが定義されています。fenv.h 内の関数と定義をカスタマイズすることで、浮動小数点エラーの処理方法を修正することができます。

ポインタ減算

以下は、C のすべてのポインタに適用されます。また、メンバへのポインタを除く C++ のポインタにも適用されます。
  • あるポインタから別のポインタを減算する場合の差は、以下の式の結果になります。
    ((int)a - (int)b) / (int)sizeof(ポインタの参照先の型)
    
  • ポインタがオブジェクトを指し、そのオブジェクトの境界整列がオブジェクトのサイズと等しい場合は、この境界整列によりこの除算は必ず割り切れます。
  • ポインタがオブジェクトを指し、パック型や大部分の struct のように、そのオブジェクトの境界整列がオブジェクトのサイズよりも小さい場合は、どちらのポインタも同じ配列の要素を指している必要があります。
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.