26

さまざまなプラットフォームで実行され、さまざまな結果が得られるように見えるコードがあります。適切な説明を探しています。

キャストがforまたはfor 1unsignedと同じように機能することを期待していました。floatdoubleint

ウィンドウズ :

double dbl = -123.45; 
int d_cast = (unsigned int)dbl; 
// d_cast == -123

ひるみ (アーム):

double dbl = -123.45; 
int d_cast = (unsigned int)dbl; 
// d_cast == 0

編集:

正しい方向を示してくれてありがとう。

回避策を修正

double dbl = -123.45; 
int d_cast = (unsigned)(int)dbl; 
// d_cast == -123
// works on both. 

脚注 1: 編集者注: 範囲外のunsigned値を符号付きの型に変換することintは、実装によって定義されます(未定義ではありません)。C17 § 6.3.1.3 - 3.

したがって、への割り当ても、特定の実装で非常に大きな正の値になるd_cast場合の標準によって確定されません。(unsigned)dbl(その実行パスには UB が含まれているため、理論的には ISO C は既に窓の外にあります)。実際には、コンパイラは通常の 2 の補数マシンで期待されることを行い、ビットパターンを変更しません。

4

1 に答える 1

31

いいえ


この変換は未定義であるため、移植性はありません。

C99 / C11 6.3.1.4

実際の浮動小数点型の有限値が_Bool以外の整数型に変換されると、小数部は破棄されます(つまり、値はゼロに向かって切り捨てられます)。整数部分の値を整数型で表すことができない場合、動作は未定義です。

C11 6.3.1.4脚注61によると:

整数型の値が符号なし型に変換されるときに実行される残りの操作は、実際の浮動型の値が符号なし型に変換されるときに実行する必要はありません。したがって、ポータブル実浮動値の範囲は(-1、Utype_MAX + 1)です。

于 2012-05-10T19:59:32.650 に答える