问题标签 [arithmetic-overflow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
124 浏览

c++ - 如何摆脱算术溢出

这是代码中的三角问题的代码,它给我一个算术溢出错误。

它通过了所有测试,除了“extreme_arith_overflow1 溢出测试,3 MAXINTs”说代码返回 0 但它期望 1。有人知道如何解决这个问题吗?

0 投票
3 回答
72 浏览

c - 防止算术溢出

我想使用 PIC18F14K50 的 ADC 外设计算电压。结果范围在 0-1023(10 位)之间。所以我用了这个简单的计算:

但是,结果是不正确的。我猜发生了算术溢出。我尝试了许多括号的组合,改变元素的顺序等
。最好的结果是 4088,ADC_Result而使用下面的代码是 1023;这离5000还差得很远。

我应该怎么做才能在上述计算中获得更好的结果?请不要建议浮点,因为它们会在 MCU 中造成灾难!他们使用大量资源而没有任何实际利益。

0 投票
1 回答
33 浏览

stored-procedures - 存储过程因“将 varchar 转换为数字数据类型的算术溢出错误”而失败。即使我明确地转换所有字段也会出错

我已经花费了大量时间来让这个存储过程正常工作,它基本上是将查询结果转换为通过电子邮件发送的 html 格式。proc 从中收集数据的查询工作正常并按预期返回结果,但是当尝试将输出放入电子邮件的表中时,它会因算术溢出错误而失败。

这些是查询的结果:

任何指导将不胜感激。

0 投票
1 回答
124 浏览

sql-server - 在 SQL Server 数据库表中的十进制(18,6)列中插入 2,147,483,648 或更大时,算术溢出转换为 int

我在 SQL Server 2012 中遇到了这个问题,但它在 SQL Server 2017 中也很明显。

我的数据库表称为它MyTable,包含一个不可为空的decimal(18,6)列。new_balance该表还包含两个整数列,它们是主键的一部分。没有其他整数字段。

存储过程有一个参数,该参数@new_balance也定义为decimal(18,6). 还有 id( @id) 和 seq_num( @seq_num) 的参数,都定义为int.

该过程按照以下行在表中执行插入:

@new_balance设置为 2147483647.999999 或更低时,插入按预期进行。
@new_balance设置为大于或等于 2147483648 的数字时,例如 2147483648.1,该过程将失败,并出现将表达式转换为 int 错误的算术溢出。我很欣赏 int 列的最大值是 2147483647。

使用以下插入也是这种情况:

鉴于参数和表列都定义为decimal(18,6),我很难理解为什么将转换为 int 作为插入的一部分(尤其是在第二个语句中,我不希望有任何隐式转换)。

我还尝试将@new_balancetodecimal(18,6)明确转换为INSERT语句的一部分:

这也没有奏效。

奇怪的是,如果我在查询中指定具有相同定义的表变量并执行类似的插入,它工作正常:

我在程序中尝试过这种方法,即先将记录插入@MyTable,然后尝试插入MyTable如下:

这也不起作用。

为了完整起见,我还尝试创建值为零的记录,然后更新现有记录 - 再次失败,因此 INSERT 和 UPDATE 都会出现此问题:

这很好 - 但下一步给出与上面报告的相同的错误:

确认一下,表上没有INSTEAD OF INSERT触发器或AFTER UPDATE触发器 - 没有任何类型的触发器。

数据库上未启用更改跟踪,并且此特定字段没有约束 - 实际表中的其他十进制 (18,6) 字段有默认约束。

也没有视图添加到数据库中。

我在这个论坛上的第一个问题 - 希望有人自己经历过这个问题并且可能知道如何解决它,尽管我找不到类似性质的问题。我难住了。

0 投票
1 回答
196 浏览

rust - 预计算术溢出但未发生

(我正在使用 Rust 1.44.1)

以下示例由于算术溢出而无法构建(调试模式)(我明白为什么):

虽然此示例正确构建:

由于i它是不可变的,因此我预计会出现与第一个示例相同的错误。

我错过了什么或者这是编译器没有处理的东西吗?

0 投票
1 回答
465 浏览

c# - 运行更新数据库 EFCore 时出现算术溢出错误

Update-Database在 EF Core 中运行时出现此错误:

将数字转换为数字数据类型的算术溢出错误。
该语句已终止。

此 SQL 段也被突出显示。

执行 DbCommand (10ms) 失败 [Parameters=[], CommandType='Text', CommandTimeout='30']

IF EXISTS (SELECT * FROM [sys].[identity_columns] WHERE [name] IN (N'DiverId', N'CreatedAt', N'DriverId', N'EmployeeNumber', N'Name', N'SiteId', N 'UpdatedAt') AND [object_id] = OBJECT_ID(N'[Drivers]'))
SET IDENTITY_INSERT [Drivers] ON;
插入 [Drivers] ([DiverId], [CreatedAt], [DriverId], [EmployeeNumber], [Name], [SiteId], [UpdatedAt])
值 (1, '2020-04-30T10:41:02.0000000', -9193900000000000000.0,119642,N'WDE274YE TOCHUKWU',-914179000000000000000000000.0,'2020-06-01T03:01:01:34.0000000'
) ABUBAKAR',-9141790000000000000.0,'2020-06-01T03:01:34.0000000');

IF EXISTS (SELECT * FROM [sys].[identity_columns] WHERE [name] IN (N'DiverId', N'CreatedAt', N'DriverId', N'EmployeeNumber', N'Name', N'SiteId', N 'UpdatedAt') AND [object_id] = OBJECT_ID(N'[Drivers]'))
SET IDENTITY_INSERT [Drivers] OFF;

这是模型类Driver

0 投票
2 回答
76 浏览

c++ - 在 C++ 中使用所有 32 位整数的算术溢出?

这应该只是将 1 添加到 unsigned int:prev = nums[nextIndex + 1];但它给出了一个警告说

算术溢出:对 4 字节值使用运算符“+”,然后将结果转换为 8 字节值。在调用运算符“+”之前将值转换为更广泛的类型以避免溢出

但我没有使用任何 8 字节值,它们都是 32 位整数......为什么它为我将东西转换成 8 字节值?

我在 LeetCode 上做一些问题,所以这里是我正在处理的问题的完整代码,只是旋转一个整数向量:

nextIndex也给出了相同的警告,唯一摆脱它的是将所有内容都转换为无符号整数。我不明白为什么当我绝对不​​使用 8 字节值时它说我使用的是 8 字节值。过去我忽略了这样的警告,但 LeetCode 非常重视它们。谢谢你。

0 投票
2 回答
122 浏览

c# - 如何防止算术溢出破坏类的内部状态?

我有一个类,它有两个int字段xy,以及一个方法Increment,分别递增这两个字段dxdy。我想防止我的类的状态被静默算术溢出破坏(这将导致xy两者都变为负数),所以我明确地增加了checked块中的字段:

这应该确保在算术溢出的情况下,调用者将收到一个OverflowException,并且我的班级的状态将保持不变。但是后来我意识到,在已经成功递增y之后,可能会在 的增量中发生算术溢出,从而导致不同类型的状态损坏,其破坏性不亚于第一种。x所以我改变了这样的Increment方法的实现:

这似乎是该问题的合乎逻辑的解决方案,但现在我担心编译器可能会“优化”我精心设计的实现,并以允许在添加x之前发生分配的方式重新排序指令y + dy,从而再次导致状态损坏. 我想问一下,根据 C# 规范,这种不受欢迎的情况是否可能。

我也在考虑删除checked关键字,而是在启用“检查算术溢出”选项(<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>)的情况下编译我的项目。关于方法内指令的可能重新排序,这会产生什么不同Increment吗?


更新:使用元组解构可以实现更简洁的算术溢出安全实现。这个版本与详细实现有什么不同(不太安全)吗?

澄清:旨在MyClass用于单线程应用程序。线程安全不是问题(我知道它不是线程安全的,但没关系)。

0 投票
1 回答
44 浏览

sql - 算术溢出取决于按列分组

我收到此错误,但仅在按特定列分组时:

我无法理解为什么。这是导致它的查询(求和函数是罪魁祸首):

p.SlutLopLangd 和 p.StartLopLangd 都是 int 列。如果我在求和之前将值转换为 bigints,它会起作用:

给出这个结果:

AtgardAvvattningId 对象标识符 TotalLangd
DC9... 9B2... 25684
电子病历... 9B2... 25700
3D0... 9B2... 170005
959... 9B2... 170005
贝... 214... 11814
C31... 214... 11815

如您所见,没有总和接近 int 的极限。奇怪的是,如果我像这样在 group by 子句中包含 positionId,它不会引发错误:

在这种情况下,AtgardAvvattning 和 Position 之间是一对一的关系。此查询给出与上述完全相同的结果。

当值如此之小时,为什么首先会引发算术溢出?为什么它在第二个中起作用?有什么不同?我知道没有数据和表结构可能很难给出答案,但任何提示都会有所帮助。

更新:

完全使用此查询删除组时:

结果根本没有多少行:

AtgardAvvattningId 对象标识符 职位编号 VnaId StartLopLangd 荡妇LopLangd 减法
DC96... 9B2... 473... 1345183 168501 174922 6421
ECD4... 9B2... 07E... 1252649 74602 81027 6425
ECD4... 9B2... 07E... 1252651 74602 81027 6425
ECD4... 9B2... 07E... 1252652 74602 81027 6425
ECD4... 9B2... 07E... 1252650 74602 81027 6425
DC96... 9B2... 473... 1345180 168501 174922 6421
DC96... 9B2... 473... 1345181 168501 174922 6421
DC96... 9B2... 473... 1345182 168501 174922 6421
3D08... 公元前9... F18... 1374284 199000 233001 34001
3D08... 公元前9... F18... 1374283 199000 233001 34001
9590... 公元前9... 二维... 1374285 16591 50592 34001
9590... 公元前9... 二维... 1374286 16591 50592 34001
9590... 公元前9... 二维... 1374287 16591 50592 34001
9590... 公元前9... 二维... 1374289 16591 50592 34001
9590... 公元前9... 二维... 1374288 16591 50592 34001
3D08... 公元前9... F18... 1374281 199000 233001 34001
3D08... 公元前9... F18... 1374280 199000 233001 34001
3D08... 公元前9... F18... 1374282 199000 233001 34001
C31B... 214... B20... 1349999 32756 44571 11815
BEC3... 214... F21... 1349998 205022 216836 11814

但是,您对行求和,应该很难达到 int 溢出限制。