2017年11月15日
《その128》 符号付き整数と符号無し整数(2)
符号付き整数と符号無し整数
前回《その127》で、自分が使う処理系の「各整数型が表すことのできる値の範囲」を調べました。
例えば、
◆signed char
(int)numeric_limits::min() … -128
(int)numeric_limits::max() … 127
◆unsigned char
(int)numeric_limits::min() … 0
(int)numeric_limits::max() … 255
でした。
この結果から、自分の処理系は、多くの処理系で用いられている 2の補数表現を採用していることがわかりました。
signed char も unsigned char も、共に 8ビットで、ビット数は同じです。
この二つの整数型間の型変換のルールについて、新版明解C++中級編に次のように書かれています。
[1] unsigned char x から signed char への型変換
(@) x が そのまま signed char で表現できる場合
変換後の値 … x
(A) x が signed char で表現できない(127を超える)数の場合
変換後の値 … 処理系依存
[2] signed char x から unsigned char への型変換
(@) x >= 0 の場合
変換後の値 … x
(A) x < 0 の場合
変換後の値 … x + (1 + 255)
[2] の (A) だけが、ちょっと分かりにくいです・・・
例えば、signed char の -3 を unsigned char に型変換すると、
-3 + (1 + 255)
を計算して、253 になるわけです。
この計算が何をやってるのか分からないと気持ち悪いですよね。
計算式を見て意味がわかる人はいいですが、そういうのはニガテという人(私もその一人ですが…)は、次の表を見てください。
signed char の -3 のビットの並びを、unsigned char としてみてみると 253 です。それだけのことだったんですね ( ̄ω ̄A;アセラセンナヨ
[1] の (A) の場合は 処理系依存となっていますが、処理系が2の補数表現を採用している場合には、上の表から、変換の結果を知ることができます。
例えば、unsigned char の 246 を を signed char に型変換すると -10 になることが分かります。
unsigned char の 245 を signed char に型変換すると -11 です。
ビット数が同じ型間の型変換では、ビットの並びの変化はありません。そのビットの並びが対応する数値が、型によって異なる場合に、値が変化するだけです。
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6971731
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック