では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場合はすべてが許可されるため、これも有効です。varshort