ではreturn var;
、 の値がvar
関数の戻り値の型である に変換されshort
ます。C 実装では値が の範囲外であるためshort
、オーバーフローが発生します。C 仕様では、整数オーバーフローが発生した場合に何が起こるかを定義していません。
それにもかかわらず、動作は少し奇妙です。呼び出しではprintf
、多くの C 実装が から 16 ビットのみを使用しfun()
、それらを にプロモートしint
、 に渡しますprintf
。したがって、オーバーフローしても出力は「0」になります。
あなたのケースで起こっている可能性があるのは、コンパイラshort
が単にそれを無視し、それが保持されていたプロセッサレジスタに値を残すことによってへの変換を実装することですvar
(同じレジスタを使用して関数値を返します)。これは C 標準で許可されていlong
ます。レジスタ内の値がshort
ドメイン内にある場合、ビットを変更せずにそのままにしておくと、 として解釈されたときに同じ値が生成されるためshort
です。long
値がドメイン外にある場合、short
何が起こるかは C 標準では定義されていないため、問題ではありません。
次に、レジスタの内容が引数として単純に直接渡さprintf
れます。値がドメイン内にある場合は正しい結果が生成され、値がドメイン内にないshort
場合はすべてが許可されるため、これも有効です。var
short