10 進数 (decimal) 型から 10 進数 (decimal) 型への変換

変換される decimal 型の値が、正確に表現できる値の範囲内にある場合、その decimal 型の値は変更されません。

変換される decimal 型の値が、表現できる値の範囲外にある場合、decimal 型の値は切り捨てられます。 切り捨ては、整数部か小数部のいずれか、またはその両方で起こることがあります。

切り捨てが小数部で発生する場合は、 コンパイル時メッセージも実行時の例外も生成されません。

切り捨てが整数部で発生する場合は、コンパイル時メッセージか実行時の例外、またはその両方が次のように生成されます。
  • 静的変数または外部変数の初期化において
    • 整数部の中のゼロ以外の数字が切り捨てられた場合、コンパイル時エラー
  • 自動変数、代入、またはプロトタイプによる関数呼び出しにおいて
    • コンパイル時に警告が出る
    • 実行時に整数部でゼロ以外の桁が切り捨てられる場合、ランタイム例外 SIGFPE が発生することがあります。
注: 明示的なキャストを使用すると、コンパイル時メッセージおよび実行時の例外が抑止されます。 実行時の例外が発生するのは、先行するゼロ以外の数字が廃棄され、操作が明示的なキャスト操作でない場合です。
以下の例で、
  • メッセージとは、コンパイル時メッセージを表します。
  • 例外 はランタイム例外を表します ( つまり、 SIGFPE が発行されます ) 。

図 1 では、表示できない小数部の例を示しています。 ある 10 進数オブジェクトを、精度がもっと少ない別の 10 進オブジェクトに変換すると、小数点の右側が切り捨てられます。

図 1. 小数部が表示されない場合
#include <decimal.h>

void func(void);
void dec_func(decimal( 7, 1 ));
decimal( 7, 4 ) x = 123.4567D;
decimal( 7, 1 ) y;
decimal( 7, 1 ) z = 123.4567D;  /* z = 000123.4D <-- No message,    */
                                /*                   No exception   */
void func(void) {
  decimal( 7, 1 ) a = 123.4567D;  /* a = 000123.4D <-- No message,  */
                                  /*                   No exception */
  y = x;            /* y = 000123.4D   <-- No message, No exception */
  y = 123.4567D;    /* y = 000123.4D   <-- No message, No exception */
  dec_func(x);                      /* <-- No message, No exception */
}

図 2 は、表示されない整数部の例を示しています。ある 10 進オブジェクトを、桁数がもっと少ない別の 10 進オブジェクトに変換すると、小数点の左側が切り捨てられます。

図 2. 整数部が表示されない場合
void func(void);
void dec_func(decimal( 5, 2 ));
decimal( 8, 2 ) w = 000456.78D;
decimal( 8, 2 ) x = 123456.78D;
decimal( 5, 2 ) y;
decimal( 5, 2 ) z = 123456.78D;     /* <-- Compile-time error        */
decimal( 5, 2 ) z1 = (decimal( 5, 2 )) 123456.78D;
                                    /* z1 = 456.78D <-- No message,  */
                                    /*                  No exception */
void func(void) {
  decimal( 5, 2 ) a = 123456.78D;   /*  <-- Checkout warning         */
                                    /*                 and exception */
  decimal( 5, 2 ) a1 = (decimal( 5, 2 )) 123456.78D;
                                    /* a1 = 456.78D <-- No message,  */
                                    /*                  No exception */
  y = w;           /* y = 456.78D <-- Checkout warning, No exception */
  y = x;                       /* <-- Checkout warning and exception */
  y = 123456.78D;              /* <-- Checkout warning and exception */
  dec_func(x);                 /* <-- Checkout warning and exception */

  y = (decimal( 5, 2 )) w;
                         /* y = 456.78D <-- No message, No exception */
  y = (decimal( 5, 2 )) x;
                         /* y = 456.78D <-- No message, No exception */
  y = (decimal( 5, 2 )) 123456.78D;
                         /* y = 456.78D <-- No message, No exception */
  dec_func((decimal( 5, 2 )) x);
                                     /* <-- No message, No exception */
}