引き続き蛇足・・・。
新スレを立てるべきかもしれませんね^^;
7さん さんが書きました:> 使ったことの無いChar型についてちょっと調べてみたら、ASCIIコードだけを扱うんですね。
> -128~127なので、マイナスの文字コードがあってそれを操作する為の型なのかと思ってました...。
ちなみに私は、Char型=Byte型だとさっきまで思ってました(^^;)。
文字コード(ASCII)を扱うための変数なのに、なんで符号付にしているのか・・・。
必要なのは0~255なのだから、符号無で良いじゃないかと。
それとも・・・いわゆるアルファベットは0~127の範囲だから、
だったら空いたビットを用いてマイナスも表現しておこう、というノリなのか。
う~ん。分からない(?_?)
7さん さんが書きました:> 値が溢れた場合?、上限値(?)が設定されるんですね。これは何か使い道がありそう。
いや、「-1」はオーバーフロー(上限値超)の意味じゃないです。
> いや、ご存知じゃないです...どうやるんでしょう。説明をうまく理解できません...。
失礼しました。
えっと・・・
「それぞれの変数型の値の表現法方法が違うのです」って言って伝わるでしょうか?
簡単のために、ビット数が一番小さいChar型(符号あり)、Byte型(符号無し)を例に取ります。
ともに8bitで値を表現します。
Char型は正負の整数を表すための型です。
ここで「マイナスを表現するために最上位のビットを利用する」と約束します。
したがって、最上位を除いた残りの7bitで整数を表現することになります。
その範囲は
コード: 全て選択
000,0000( = 0) ~ 111,1111( = 127)
になります。
これで正の整数は最大127まで表現できました。
では、残りの1ビット(最上位)を使って負の整数を表現することを考えます。
バランス的に、-128くらいまで表現できれば良いですよね。
ならば「最上位のビットはマイナスを意味する」と
約束し
1000,0000 = 128 → Char型においては「-128」を意味する
とするわけです。
したがって、
コード: 全て選択
8ビット 最上位 それ以外のビット
(&H80)
1000,0000 = 1000,0000 + 0000,0000
= (-128) + 0
= -128
(&Hf5)
1111,0101 = 1000,0000 + 0111,0101
= (-128) + 117
= -10
(&Hff)
1111,1111 = 1000,0000 + 0111,1111
= (-128) + 127
= -1
(&H75)
0111,0101 = 0000,0000 + 0111,0101
= ( 0 ) + 117
= +117
(&H0a)
0000,1010 = 0000,0000 + 0000,1010
= ( 0 ) + 10
= +10
(&H7f)
0111,1111 = 0000,0000 + 0111,1111
= ( 0 ) + 127
= +127
と8bitを用いて-128~+127が表現されるわけです。
一方で
Byte型は、符号無しなので、符号の有無を考える必要が無く、
8ビット全部を使って整数を表現すれば良い。
したがってその範囲は
コード: 全て選択
0000,0000( = 0) ~ 1111,1111( = 255)
になります。
つまり、同じ8ビットを使った整数の表現でも、表現方法(=約束事)の違いによって、
ビットが表す値が変わる、ということです。
そこをキチンとやるために型変換(キャスト)が必要、となるわけです。
コード: 全て選択
Dim b As Byte
Dim c As Char
Dim i As Integer
b = 255 '(=1111,1111)
c = -1 '(=1111,1111)
'仮にキャストしなければ、そのままビットを移すと仮定して
i = b '(0000,0000,1111,1111 = 255)
i = c '(0000,0000,1111,1111 = 255) ※つまり「-1→255」であり、値が壊れた。
i = c As Integer '(1111,1111,1111,1111 = 65535)※キャストすると、値が壊れないようにビットを変えて格納する
/*
Integer型に置いて、-1は「1111,1111,1111,1111=&Hffff」で表現される。
したがって、格納されるビットの内容はcのビットをそのまま移したもの(&H00ff)ではなく、
こちらの&Hffffとなる。これによって「-1→-1」となり、値は壊れない・
*/
・・・でも、
上記のコードは嘘で(マテ)、実際にはキャストしなくても
「-1→-1」ちゃんと保持(暗示的にキャストしてる)してくれますね。
わ~い、コンパイラさん賢い~(苦笑)。
むしろ、こっちみたいですね。キャストに意味を持たせようとするならば。
コード: 全て選択
Dim b As Byte
Dim c As Char
Dim i As Integer
b = 255 '(=1111,1111)
c = -1 '(=1111,1111)
i = b '「255」が代入される。
i = c As BYte '「255」が代入される。
i = b As Char '「-1」が代入される。
i = c '「-1」が代入される。
・・・う~ん。キャストの必要性を感じねーな(爆)。
(個人的には、構造体のキャストくらいしか恩恵感じてなかったり・・・とまた余計なことを言ってみる^^;)。
---
追記:
また前後してしましました。今度はイグトランスさんと・・・。
あ~、「符号拡張」って呼ぶんですね。初めて知りました^^;。