越界!?

crack007 2002-05-18 12:01:43
这是一个音量控制部分.其中 0 =< t <= 255

procedure TMainForm.VolumeTrackBarChange(Sender: TObject);0D var
t,v:longint;
begin
t:=volumeTrackBar.Position;
v:=(t shl 8) or (t shl 24); //按理说,此处应该不会越界才对,但他偏偏就越界了,怎么回事?比如 t=171 时。
waveOutSetVolume(0,v);
end;
...全文
59 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
eulb 2002-05-18
  • 打赏
  • 举报
回复
问题就在longint是有符合的类型
用longword!
在进行shl or等逻辑操作时,可不能用有符号数
否则会莫名其妙的出错
我就碰到过
sleeepboy 2002-05-18
  • 打赏
  • 举报
回复
而且WaveOutSetVolume的第二个参数要得是DWORD型 也就是longword
weizhi 2002-05-18
  • 打赏
  • 举报
回复
呵呵,要不你改V为LongWord型吧!
sleeepboy 2002-05-18
  • 打赏
  • 举报
回复
longint型是有符号的
改成longword型的试试
weizhi 2002-05-18
  • 打赏
  • 举报
回复
呵呵,你有没有看看v:=(t shl 8) or (t shl 24); 之后V的值是多少?

在这句下面加一行
showmessage(inttostr(v));
然后你就会发现问题的.

日总是我哥 2002-05-18
  • 打赏
  • 举报
回复

把v改为Double类型看看~~

5,402

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧