2017年11月15日
《その129》 符号付き整数と符号無し整数(3)
符号付き整数と符号無し整数
前回《その128》に引き続いて、ちょっとしつこいですが、もう一回だけ・・・ (ノω・`;
自分の使っている処理系では、unsigned char は 8ビット、int は 32ビットです。
この二つの整数型間の型変換のルールについて、新版明解C++中級編に次のように書かれています。
[1] unsigned char x から int への型変換
変換後の値 … x
[2] int x から unsigned char への型変換
(@) x >= 0 の場合
変換後の値 … x % (1 + 255)
(A) x < 0 の場合
変換後の値 … (1 + 255) - (-x % (1 + 255))
[1] のときは値が変わらないので問題なしです。
[2] の (@) のときは、
例えば、int の 2147483645 を unsigned char に型変換すると、
2147483645 % (1 + 255)
を計算して、253 になります。
[2] の (A) のときは、
例えば、int の -6 を unsigned char に型変換すると、
(1 + 255) - (-(-6) % (1 + 255))
を計算して、250 になります。
この計算が何をやってるのか、やっぱりちょっと・・・(;^ω^) なので、ビジュアルでいきます。
[2] の (@) の場合
int の 2147483645 は 32ビットですが、unsigned char は 8ビットなので、
最初の表の 32ビットの 01111111111111111111111111111101 から
末尾の 8ビットを取り出すと 11111101、
二番目の表からこれは unsigned char の 253 だとわかります。
[2] の (A) の場合
int の -6 は 32ビットですが、unsigned char は 8ビットなので、
最初の表の 32ビットの 11111111111111111111111111111010 から
末尾の 8ビットを取り出すと 11111010、
二番目の表からこれは unsigned char の 250 だとわかります。
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6972066
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック