关于Pascal的类型强制转换与默认运算类型的求助

桑汤奈伊伏 2016-01-03 03:15:22
背景描述:
今天刚看的pascal,定义了var b为Real,在调用odd判断类型的时候却编译出错:
if odd(b) then z := z + a;

错误消息:
PL0.pas(18,15) Error: Incompatible type for arg no. 1: Got "Real", expected "QWord"[/size]
看了free pascal对odd函数的说明:
http://www.freepascal.org/docs-html/rtl/system/odd.html
那就给b强转为Qword
if odd(QWord(b)) then z := z + a;

结果编译通过了,执行又出错了,出现了死循环一直输出x

完整代码:
program ideone;
const m = 7;
const n = 5;
var x:Real;
var y:Real;
var z:Real;
var q:Real;
var r:Real;

procedure multiply();
var a:Real;
var b:Real;
begin a := x; b := y; z := 0;
while b > 0 do
begin
if odd(Qword(b)) then z := z + a;
writeln('x', 1);
a := 2*a;
writeln('x', 1);
b := b/2;
end
end;

begin
x := m; y := n;
multiply();
writeln(z);
end.


问题有两个:
1.像a := 2*a; 这样的语句,运算的结果默认是extended的吗?如果我把a定义为LongInt,编译就会报类型不兼容的错误(Real不会)
2.为什么会出现死循环,一直输出x
...全文
263 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathletboy 2016-01-04
  • 打赏
  • 举报
回复
整形除法要用div
桑汤奈伊伏 2016-01-03
  • 打赏
  • 举报
回复
引用 2 楼 pathletboy 的回复:
第一个问题,a是什么类型,运算结果就是什么类型 第二个问题,因为你b是浮点,所以不管如何除,总归>0,自己仔细想想,只有整型 1/2的时候才会等于0。
关于你的“a是什么类型,运算结果就是什么类型”还是有点疑问,比如a := a / 2 我定义的a是LongInt但是,还是会类型错误报错说是讲extended的类型赋值给LongInt 第二个确实如此,自己低级错误了
npkaida 2016-01-03
  • 打赏
  • 举报
回复
while b > 0 do begin if odd(Qword(b)) then z := z + a; //odd 是判断一个数是否为奇数,浮点数没有奇偶之分。 writeln('x'); a := 2*a; b := b/2; // b>0 无论除几次 2 都是>0,必然死循环 end
npkaida 2016-01-03
  • 打赏
  • 举报
回复
program ideone; const m = 7; const n = 5; var x:Integer; var y:Integer; var z:Integer; procedure multiply(); var a:Integer; var b:Integer; begin a := x; b := y; z := 0; while b > 0 do begin if odd(b) then z := z + a; writeln('x'); a := 2*a; b := b div 2; end end; begin x := m; y := n; multiply(); writeln(z); end.
pathletboy 2016-01-03
  • 打赏
  • 举报
回复
第一个问题,a是什么类型,运算结果就是什么类型 第二个问题,因为你b是浮点,所以不管如何除,总归>0,自己仔细想想,只有整型 1/2的时候才会等于0。
桑汤奈伊伏 2016-01-03
  • 打赏
  • 举报
回复
program ideone;
const m = 7;
const n = 5;
var  x:Real;
var  y:Real;
var  z:Real;
var  q:Real;
var  r:Real;

procedure  multiply();
var a:Real;
var b:Real;
begin  a := x;  b := y;  z := 0;
  while b > 0 do
    begin  
      if odd(Qword(b)) then z := z + a;
      writeln('x');
      a := 2*a;  
      b := b/2;
    end
end;

begin 
  x := m;  y := n;  
  multiply();
  writeln(z);
end.
上面代码贴错了,做了一些改动

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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