>
コード: 全て選択
Dim a As Long
> Dim b As Char
> b = -2
> a = &HFFFFFFFF Xor Not b
>
> *追記
> 上でいけるかと思いましたが、
> Not b の結果がLong型になってないと成立しない計算ですね。
ぅ~ん...どういう処理をしてるのかほとんど分からないですね...。
それにしてもコンボボックスから随分とお話をずらしてしまいました...。
コード: 全て選択
Dim a As Long
> Dim b As Char
> b = -2
> a = &HFFFFFFFF Xor Not b
>
> 値が溢れた場合?、上限値(?)が設定されるんですね。これは何か使い道がありそう。淡幻星さん さんが書きました:Code:
Dim w As Word
Dim i As Integer
i = &Hffff '「-1」を表す。
w = i As Word '「65535」を表す。
ちなみに私は、Char型=Byte型だとさっきまで思ってました(^^;)。7さん さんが書きました:> 使ったことの無いChar型についてちょっと調べてみたら、ASCIIコードだけを扱うんですね。
> -128~127なので、マイナスの文字コードがあってそれを操作する為の型なのかと思ってました...。
いや、「-1」はオーバーフロー(上限値超)の意味じゃないです。7さん さんが書きました:> 値が溢れた場合?、上限値(?)が設定されるんですね。これは何か使い道がありそう。
コード: 全て選択
000,0000( = 0) ~ 111,1111( = 127)
コード: 全て選択
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
コード: 全て選択
0000,0000( = 0) ~ 1111,1111( = 255)
コード: 全て選択
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」となり、値は壊れない・
*/
コード: 全て選択
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」が代入される。
どちらのリンク先も難しくて悩ましいんですけど、各ビットを反転させた値に1を足すと符号の逆転?が出来るってのが驚きというか勉強になりました。イグトランスさん さんが書きました:> 値が溢れた場合?、上限値(?)が設定されるんですね。これは何か使い道がありそう。
というよりもこれはInteger型の-1のビットパターンが、ちょうどWord型の65535のビットパターンと一致するからです。
2の補数 - Wikipedia
上位のビットには、おそらく変換先の型が符号付か符号無かによって符号拡張か0拡張を行うはずです。
符号拡張 - Wikipedia
コード: 全て選択
Dim i As Integer
i=10000
i=(i Xor &HFFFF)+1 ' -10000になる
' i=-i ' いつもはこうやる
なるほど。だから値が壊れる現象って起きないんですね。(あんまり?)淡幻星さん さんが書きました:つまり、同じ8ビットを使った整数の表現でも、表現方法(=約束事)の違いによって、
ビットが表す値が変わる、ということです。
そこをキチンとやるために型変換(キャスト)が必要、となるわけです。
中略
・・・でも、上記のコードは嘘で(マテ)、実際にはキャストしなくても
「-1→-1」ちゃんと保持(暗示的にキャストしてる)してくれますね。
余計なことを言ってくれましたね(^_^)淡幻星さん さんが書きました:(個人的には、構造体のキャストくらいしか恩恵感じてなかったり・・・とまた余計なことを言ってみる^^;)。
コード: 全て選択
Dim rc As RECT
Dim pt As POINTAPI
' ウィンドウの位置をPOINTAPIに代入(コピー)する
' 通常のやり方
GetWindowRect(hMainWnd,rc)
memcpy(VarPtr(pt),VarPtr(rc),SizeOf(POINTAPI))
' ウィンドウの位置をPOINTAPIに代入(コピー)する
' 構造体のキャスト?動かない。
' GetWindowRect(hMainWnd,rc)
' pt=rc As POINTAPI
7さん、大変申し訳ない。> 構造体のキャストってどういうことでしょうか?
>> これ動いたら凄くいいと思いました...。コード: 全て選択
Dim rc As RECT > Dim pt As POINTAPI > > ' ウィンドウの位置をPOINTAPIに代入(コピー)する > ' 通常のやり方 > GetWindowRect(hMainWnd,rc) > memcpy(VarPtr(pt),VarPtr(rc),SizeOf(POINTAPI)) > > ' ウィンドウの位置をPOINTAPIに代入(コピー)する > ' 構造体のキャスト?動かない。 > ' GetWindowRect(hMainWnd,rc) > ' pt=rc As POINTAPI
コード: 全て選択
pt = rc As POINTAPI
/* C/C++だと、これで通ったはず。
pt = (POINTAPI)rc
*/