E2099 转换或算术运算溢出

2023-12-01

我想将 int64 与这样的变量进行比较:

const GB=1073741824;
if DiskFile.Size< 1*GB then 

它适用于 1 但不适用于 3:

if DiskFile.Size< 3*GB then 

这个帖子 (奇怪的 Delphi 整数乘法行为)解释了原因。我同意这个解释。 2*GB 的结果无法容纳在“整数”中。我不明白的是为什么编译器选择整数而不是 int64?正如以下情况:

if DiskFile.Size< 3073741824 then      <--------- almost 3GB

这样可行。


有什么方法可以以 3*GB 样式(使用常量)编写最后一行代码,但无需为 1GB、2GB、3GB、4GB 等定义新常量?


这里首先要明确的是,整数溢出发生在编译器中。编译器必须评估你的表达式,因为它是一个常量表达式它们由编译器评估。

关于编译器如何处理表达式的文档有点稀疏(我在这里很友善)。我们至少可以凭经验推断,编译器尝试执行3*GB在有符号整数上下文中。从错误消息中可以清楚地看出这一点。

您需要强制编译器计算表达式Int64语境。强制转换将强制:

if DiskFile.Size< Int64(3)*GB then 
  ....

另一种选择是使常量具有类型Int64:

const 
  GB = Int64(1073741824);

虽然我想我会这样写:

const
  KB = Int64(1024);
  MB = 1024*KB;
  GB = 1024*MB;

只要GB是 64 位类型,那么您可以恢复为:

if DiskFile.Size < 3*GB then 
  ....

我想详细说明上面的第二段。我们如何知道编译器在 32 位有符号整数上下文中执行算术?以下程序表明情况确实如此:

{$APPTYPE CONSOLE}

const
  C1 = 715827882; // MaxInt div 3
  C2 = C1+1;

begin
  Writeln(3*C1);
  Writeln(3*C2);
  Readln;
end.

第一个表达,3*C1编译,第二个失败并显示 E2099。第一个表达式不会溢出有符号 32 位整数,第二个表达式会溢出。

当看着文档,尚不清楚是否为真实常数1073741824应该是类型Integer or Cardinal。编译器可以选择其中之一。看起来,当编译器在有符号类型和无符号类型之间进行选择时,它会选择有符号类型。

但是人们可能会想象下面的程序也会以同样的方式运行,但是Smallint and Word取代Integer and Cardinal:

{$APPTYPE CONSOLE}

const
  C1 = 10922; // high(Smallint) div 3
  C2 = C1+1;

begin
  Writeln(3*C1);
  Writeln(3*C2);
  Readln;
end.

但不,这个程序可以编译。所以,在这一点上我放弃了文档这似乎与编译器的实际行为关系不大。

我最好的猜测是,整数真常量的处理方式如下:

  1. 如果在范围内Integer,它的类型是Integer.
  2. 否则,如果在范围内Cardinal,它的类型是Cardinal.
  3. 否则,如果在范围内Int64,它的类型是Int64.
  4. 否则,如果在范围内UInt64,它的类型是UInt64.
  5. 否则是编译器错误。

当然,所有这些都假设编译器计算常量表达式的规则遵循与语言的其余部分相同的规则。我不确定情况是否如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

E2099 转换或算术运算溢出 的相关文章

随机推荐

  • 选择两个特定元素之间的所有元素

    我需要选择全部a标签来自 a class self to a class next 这是例子 span class pages a class prev nbsp a a 13 a a 14 a a 15 a a 16 a a class
  • 抑制或防止重复的 inotifywait 事件?

    现在inotifywait正在监视 git 服务器文件夹 End 它仅在特定文件修改时发出 问题是 当更改被推送到 git 服务器时 inotifywait触发几次 我不知道为什么 那么我该怎么做下一步 防止inotifywait避免重复
  • 使用字符串作为函数的参数

    我正在尝试使用一个以字符串作为参数的函数 我遇到了一些错误消息 首先 它表示 string i 不是数组 指针或向量 尽管 string 是字符数组 其次 它说我正在进行指针到整数的转换 这是我的代码 include
  • 从客户端 MVC4 检测到潜在危险的 Request.Form 值[重复]

    这个问题在这里已经有答案了 我在插入带有 如何通过插入带有 提前致谢 你可以尝试设置属性requestValidationMode 2 0 on the
  • 获取:ERR_SSL_PROTOCOL_ERROR nginx + vue.js

    在 Google Chrome 的控制台日志中 我收到以下错误 GET https 192 168 1 7 8081 sockjs node info t 1579798623564 net ERR SSL PROTOCOL ERROR G
  • 使用 Spring Data JPA 进行分页

    我必须在此 GET 中执行分页请求 但我没有得到它 GetMapping value uf uf public List
  • 尝试使用 conda install 来获得 anaconda-clean 但环境无法解决并且冲突分析开始非常缓慢

    我最近遇到了很多关于 anaconda 的问题 首先我无法使用 conda install 安装软件包 每次都会导致以下错误 CondaHTTPError HTTP 000 CONNECTION FAILED for url 我多次尝试卸载
  • 使用 C# 解析复杂的 JSON

    我是 JSON 的新手 我尝试用 C 解析一些 JSON 我尝试创建一个类来用数据表示 但我的属性名称是基于时间的 所以我必须对我的数据契约进行硬编码 我尝试过 JSON NET 和 LINQ 对数据进行排序 但由于奇怪的对象 属性 不断获
  • MS Access Query 不使用标准相等运算符区分平假名和片假名

    最近 我在 MS Access 查询中搜索包含日语文本的表时遇到了问题 日语有平假名和片假名两种字母 音值相同 但字符不同 例如 平假名 和 片假名 都发音为 a 对于我来说 这两个角色需要被视为截然不同的SELECT查询 但是当我运行以下
  • PHP Session 类类似于 CodeIgniter Session 类?

    PHP会话类类似于CodeIgniter会话类 存在吗 我尝试搜索 但没有得到有用的结果 我正在使用 CodeIgniter 会话类 它有几个功能 非常喜欢 存储用户的唯一会话 ID 用户的 IP 地址 用户的用户代理数据 上次活动和其他信
  • Javas Audio Clip 频繁播放蜂鸣声时出现问题

    我想在 GUI 触发操作成功和错误时播放短蜂鸣声 WAV 文件 我碰到javax sound sampled Clip 这似乎有效 这是我使用的基本代码 clip stop clip setFramePosition 0 clip star
  • 授予数据库用户文件夹访问权限

    我正在尝试使用以下查询从 mysql 创建数据的 csv 导出 SELECT INTO OUTFILE tmp result csv FIELDS TERMINATED BY OPTIONALLY ENCLOSED BY ESCAPED B
  • 比较 Unix/Linux IPC

    Unix Linux 提供了许多 IPC 管道 套接字 共享内存 dbus 消息队列 每种应用最适合的应用是什么 它们的性能如何 Unix IPC 以下是七大 Pipe 仅在作为父 子相关的进程中有用 称呼pipe 2 and fork 2
  • 如何将第二个模式添加到我的 html 页面

    我在上一篇文章中没有解释我的问题 所以我想在我的html页面中添加第二个模态 所以如果您单击 按钮1 它将打开 模态1 如果您单击 按钮2 它将打开 模态2 但是 按钮3 按钮4 按钮5 和 按钮6 打开 模态2 当我创建第二个模态并设置下
  • 反转字符串大小写

    我正在尝试编写一个函数 该函数接受字符串并将所有小写字母更改为大写字母 反之亦然 lower UPPER 将翻译为 LOWER upper 这是我所拥有的 var convertString function str var s var i
  • 如何禁用 Spring Jpa 异常转换器方面

    我正在从 Spring 2 5 6 迁移到 3 2 5 jar spring aspects 3 2 5 包含新方面 JpaExceptionTranslatorAspect 它将标准 JPA 异常转换为 Spring 异常 这似乎是 Ro
  • 使用CSS将div的底部弯曲到内部

    我想用 CSS 弯曲这个矩形 div 背景的底边 所以结果是这样的 Does someone have an idea perhaps how it could be achieved curved margin 0 auto height
  • 动态更改 paginate_by 的值

    我希望能够允许用户更改默认页面大小 paginate by 我当前的页面大小设置为10 我想要有 25 50 等等的按钮 我正在使用 postgresql 11 4 运行 Django 2 2 和 Python 3 73 我的views p
  • Glassfish 中是否有可能为不同包记录单独的文件

    我们使用 glassfish 作为我们的应用程序服务器 我们想要单独记录消息 例如 如果日志来自xxx company xxx service包 则日志文件命名为service log 如果日志来自xxx company xxx dao 则
  • E2099 转换或算术运算溢出

    我想将 int64 与这样的变量进行比较 const GB 1073741824 if DiskFile Size lt 1 GB then 它适用于 1 但不适用于 3 if DiskFile Size lt 3 GB then 这个帖子