相关疑难解决方法(0)

在64位操作系统上32位进程可以访问多少内存?

在Windows上,在正常情况下,32位进程只能访问2GB的RAM(或者带有boot.ini文件中的特殊开关的3GB).在64位操作系统上运行32位进程时,可用内存量是多少?是否有任何特殊的开关或设置可以改变这种情况?

memory windows wow64

82
推荐指数
5
解决办法
12万
查看次数

我应该使用无符号整数来计算成员吗?

我应该为计数类成员使用无符号整数吗?

回答

例如,假设一个类

TList <T> = class
private
  FCount : Cardinal;
public
  property Count : Cardinal read FCount;
end;
Run Code Online (Sandbox Code Playgroud)

这确实有道理,不是吗?列表中存储的项目数不能为负数,那么为什么不使用无符号整数类型呢?我认为总是使用最不通用的(最特殊的)类型是一个很好的原则.

现在,迭代列表如下所示:

for I := 0 to List.Count - 1 do
  Writeln (List [I]);
Run Code Online (Sandbox Code Playgroud)

当列表中存储的项目数为零时,编译器会尝试进行评估

List.Count - 1
Run Code Online (Sandbox Code Playgroud)

这导致一个很好的整数溢出(确切地说是下溢).结合调试器没有显示发生异常的适当位置的事实,这对我来说很难找到.

让我补充一点,如果你关闭溢出检查,结果错误将更难跟踪,因为那时你经常会访问不属于你的内存 - 这会导致未定义的行为.

从现在开始,我将为所有计数成员使用普通整数来避免这种情况.

如果这完全是胡说八道,请指出给我:)

(我只花了一个小时跟踪代码中的整数溢出,所以我决定分享一下 - 当然大多数人都会知道,但也许我可以节省一些时间.)

delphi integer-overflow

9
推荐指数
4
解决办法
1576
查看次数

为什么我的应用程序中的Cardinal类型发生了变化?

我有一个程序在Delphi 3中运行正常,我在Turbo Delphi 2006上编译和测试,发现了一个问题.问题是:我使用"基数"数据类型作为某种东西的索引.它在Delphi 3中有效,但我发现Turbo Delphi 2006编译版本的值大于128-256左右,具体取决于具体的数据.将这些数据类型更改为"longint"修复了问题,以便程序与两个编译器一起正常工作.

问题:这是为什么?

我的理解是Cardinal数据类型只是典型的无符号整数数据.这与它们在这个程序中的应用是一致的,特别是通过Delphi 3编译正常工作的事实证明了这一点.那么为什么Turbo Delphi 2006编译不起作用呢?

delphi delphi-2006 delphi-3

3
推荐指数
1
解决办法
422
查看次数