アカウント名:
パスワード:
>「32ビットの符号付二進数の桁あふれ」という理由を理解するには、ある程度の専門知識を必要とする
「とりあえず31ビットの二進数の桁あふれ」という説明で良いんじゃないの?残りの1ビットはどこへいった?と聞いてくる人がいたら、それは符号ビットだよと答えれば良いし、そう質問する人はそういう説明を理解出来る人だろうからそれでいいでしょ
あるいは実行時エラーでプログラムを停止する可能性もありますね。実際、規格上はゼロ除算の結果も「未定義」で、古いAndroidはゼロ除算でエラーを起こさず黙って間違った結果のまま実行を続けたりしてくれましたが規格上は完全に合法です。
まさに「エラー」ではなく「例外」ですからね.
「例外」を意識するのって組み込みやドライバでは普通だと思いますが, アプリケーションプログラムだと, せいぜい浮動小数点例外ぐらいでしょうか.
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
ある程度の専門知識を必要とする (スコア:0)
>「32ビットの符号付二進数の桁あふれ」という理由を理解するには、ある程度の専門知識を必要とする
「とりあえず31ビットの二進数の桁あふれ」という説明で良いんじゃないの?
残りの1ビットはどこへいった?と聞いてくる人がいたら、それは符号ビットだよと答えれば良いし、そう質問する人はそういう説明を理解出来る人だろうからそれでいいでしょ
Re:ある程度の専門知識を必要とする (スコア:4, 参考になる)
time_t t = foo + bar;
などとやった場合、コンパイラは「foo + barは、MAX_INT以下である」という前提でコンパイルしても良いことになっています。 「C言語 未定義動作 バグ」ぐらいでWebを検索するといろいろ具体例が出てきますが、例えばこれ [intransient.info]とか。
time_t tomorrow = now + 60*60*24; //現在時刻nowから、丁度1日後の日時を求める
if(tomorrow < now) {// 足してるのに小さくなっていると言うことはオーバーフローしたはず! 2038年問題!
//対処コード
}
とか書くと、コンパイラは「正の整数を足してるんだから、値が小さくなるはずがない。C言語の規約で、オーバーフローするような計算はしちゃいかんことになっているから、オーバーフローが原因で負になる可能性も無い。よって、このif文の条件は常に非成立。if文の中身と条件判定を削除して高速化できるぜやっほー」、とやっても良かったりします。
なので、ぱっと見に分かりにくいバグをはらんでたり、対処したつもりが何故か利かなかったりする可能性があります。 ややこしいので「その最適化はするな」というコンパイラオプションもあるので、とりあえずそれをONにして回った方がいいでしょうね。
# ここまでintのオーバーフローが注目を集めたら、「これが未定義動作ってひどくね?」という方向へも話が飛び火したりしないのかな。
Re: (スコア:0)
あるいは実行時エラーでプログラムを停止する可能性もありますね。
実際、規格上はゼロ除算の結果も「未定義」で、古いAndroidはゼロ除算でエラーを起こさず黙って間違った結果のまま実行を続けたりしてくれましたが規格上は完全に合法です。
Re:ある程度の専門知識を必要とする (スコア:1)
まさに「エラー」ではなく「例外」ですからね.
「例外」を意識するのって組み込みやドライバでは普通だと思いますが, アプリケーションプログラムだと, せいぜい浮動小数点例外ぐらいでしょうか.