さまざまなプラットフォームで実行され、さまざまな結果が得られるように見えるコードがあります。適切な説明を探しています。
キャストがforまたはfor 1unsigned
と同じように機能することを期待していました。float
double
int
ウィンドウズ :
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 の補数マシンで期待されることを行い、ビットパターンを変更しません。