何処に書き込むか迷いましたが、ここに。
DWordNum1 = 10 ^ DWordNum2
上記の様な指数演算にて、
[警告] DoubleからDWordに強制変換されています。データが失われる可能性があります。
と出ますが、DWord 型 とリテラル値のみの演算で上記の様な警告が出るのは、そういうものなのですか。内部の演算が Double 型で扱われている様な話は聞いていますが、プログラマーから見た場合、明らかに DWord 型 の演算なのに警告が出るのはチョット変な気がします。恐らく、DWord 型 のレベルで失われるデータは、&hFFFFFFFF を超えた場合、0 を下回った場合以外は無いのではと思います。その点に関しては、DWord 型 とリテラル値の加減算でも同じで、そちらは警告が出ませんよね。
バグではなく、警告としなければ為らない理由が在るのでしたら、教えて頂けますか。
指数演算の警告
-
- 記事: 899
- 登録日時: 2005年5月31日(火) 17:59
- お住まい: 東京都
-
- 記事: 893
- 登録日時: 2005年7月25日(月) 13:27
- お住まい: 埼玉県東松山市
確かbasic/function.sbp内の関数powの仕様の関係でDouble型を返すことになってたはずです。(コンパイラ側の仕様で必ず内包される関数のひとつの筈。)
グローバル領域でのオーバーロードができれば対処できるかもしれません。
どちらにしても4.24だと無理だった気がするんですが。
具体的には
直接書き換えるとDouble型の演算がうまくいかなくなると思うのでやめておいてください。
#Fixとかは組み込むのにこいつを組み込まないのはどうしてなんでしょうねぇ・・・。
グローバル領域でのオーバーロードができれば対処できるかもしれません。
どちらにしても4.24だと無理だった気がするんですが。
具体的には
こんな奴 [ここをクリックすると内容が表示されます]
を定義(オーバーロード)する必要があるわけです。コード: 全て選択
Function pow(x As Long, n As DWord) As Long
Dim r As Long
r=1
While n
If n and 1 Then r=r*x
x=x*x
n=n>>1
Wend
pow=r
End Function
直接書き換えるとDouble型の演算がうまくいかなくなると思うのでやめておいてください。
#Fixとかは組み込むのにこいつを組み込まないのはどうしてなんでしょうねぇ・・・。
追記:山本さんが機械語を読まないのを思い出したので、組み込み用のバイナリとか作ってみました。 [ここをクリックすると内容が表示されます]
どうみても暇なだけです。
55 8B EC 53 56 8B 4D 0C B8 01 00 00 00 8B 5D 08
F7 C1 01 00 00 00 74 02 F7 EB 8B F0 8B C3 F7 E8
8B D8 8B C6 D1 E9 75 E8 5E 5B C9 C2 08 00
(46byte,呼び出し:stdcall,引数:上のコードと同一)
55 8B EC 53 56 8B 4D 0C B8 01 00 00 00 8B 5D 08
F7 C1 01 00 00 00 74 02 F7 EB 8B F0 8B C3 F7 E8
8B D8 8B C6 D1 E9 75 E8 5E 5B C9 C2 08 00
(46byte,呼び出し:stdcall,引数:上のコードと同一)
source code [ここをクリックすると内容が表示されます]
コード: 全て選択
pow proc x:dword,n:dword
push ebx
push esi
;ret=r=eax
;n=ecx
;x=ebx
mov ecx,n
mov eax,1
mov ebx,x
_l1:
test ecx,1
jz _l2
imul ebx
_l2:
mov esi,eax
mov eax,ebx
imul eax
mov ebx,eax
mov eax,esi
shr ecx,1
jnz _l1
pop esi
pop ebx
ret
pow endp
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。