C言語自体には、intは少なくとも-32767~32767を、unsigned intは少なくとも0~65535を表現できること、という決まりがあるだけで、(unsigned) intの表現できる値の範囲も、負の数をどうやって扱うかも規格では決められていないことは心の片隅に留めておきましょう。負数が2の補数でない処理系は現実として皆無かも知れませんが、(unsigned) intが16bit幅な処理系にはまだまだ出会うチャンスがあるかも知れません。
で。以下intが16bitの場合を例にとります(ビットパターンを書く手間がましなので)が、
unsigned intは与えられたビットパターンを単純に数値におけばいいですから、intが16bitなら0~65535を表現できる、これは問題ないでしょう。
signed intで負数の表現に2の補数を使う場合は...
0と、1(0b0000000000000001)~32767(0b0111111111111111)とそれに対応する-1(0b1111111111111111)~-32767(0b1000000000000001)までは問題ないでしょう。
ここまでで使っていないビットパターンは0b1000000000000000です。これをビット反転して1を足すと0b1000000000000000自身に戻ってしまいます。これの符号を反転した値は、与えられたビット数では表現できないということ。ここで、この値に1を足すと0b1000000000000001つまり-32767なので、0b1000000000000000は-32768と解釈することができます。32768は表現できません。
以上より、16bit幅のsigned intは-32768~32767を表現できる、ということになります。
ビット数に対して一般化するなら、
(unsigned) intがN bit幅の場合、
unsigned intは0 ~ 2のN乗-1 を表現できる
2の補数表現を用いるsigned intは-(2の(N-1)乗) ~ 2の(N-1)乗-1 を表現できる
ということですね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/22 00:47
退会済みユーザー
2020/09/28 12:51