问题标签 [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.
c++ - 如何摆脱算术溢出
这是代码中的三角问题的代码,它给我一个算术溢出错误。
它通过了所有测试,除了“extreme_arith_overflow1 溢出测试,3 MAXINTs”说代码返回 0 但它期望 1。有人知道如何解决这个问题吗?
c - 防止算术溢出
我想使用 PIC18F14K50 的 ADC 外设计算电压。结果范围在 0-1023(10 位)之间。所以我用了这个简单的计算:
但是,结果是不正确的。我猜发生了算术溢出。我尝试了许多括号的组合,改变元素的顺序等
。最好的结果是 4088,ADC_Result
而使用下面的代码是 1023;这离5000还差得很远。
我应该怎么做才能在上述计算中获得更好的结果?请不要建议浮点,因为它们会在 MCU 中造成灾难!他们使用大量资源而没有任何实际利益。
stored-procedures - 存储过程因“将 varchar 转换为数字数据类型的算术溢出错误”而失败。即使我明确地转换所有字段也会出错
我已经花费了大量时间来让这个存储过程正常工作,它基本上是将查询结果转换为通过电子邮件发送的 html 格式。proc 从中收集数据的查询工作正常并按预期返回结果,但是当尝试将输出放入电子邮件的表中时,它会因算术溢出错误而失败。
这些是查询的结果:
任何指导将不胜感激。
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_balance
todecimal(18,6)
明确转换为INSERT
语句的一部分:
这也没有奏效。
奇怪的是,如果我在查询中指定具有相同定义的表变量并执行类似的插入,它工作正常:
我在程序中尝试过这种方法,即先将记录插入@MyTable
,然后尝试插入MyTable
如下:
这也不起作用。
为了完整起见,我还尝试创建值为零的记录,然后更新现有记录 - 再次失败,因此 INSERT 和 UPDATE 都会出现此问题:
这很好 - 但下一步给出与上面报告的相同的错误:
确认一下,表上没有INSTEAD OF INSERT
触发器或AFTER UPDATE
触发器 - 没有任何类型的触发器。
数据库上未启用更改跟踪,并且此特定字段没有约束 - 实际表中的其他十进制 (18,6) 字段有默认约束。
也没有视图添加到数据库中。
我在这个论坛上的第一个问题 - 希望有人自己经历过这个问题并且可能知道如何解决它,尽管我找不到类似性质的问题。我难住了。
rust - 预计算术溢出但未发生
(我正在使用 Rust 1.44.1)
以下示例由于算术溢出而无法构建(调试模式)(我明白为什么):
虽然此示例正确构建:
由于i
它是不可变的,因此我预计会出现与第一个示例相同的错误。
我错过了什么或者这是编译器没有处理的东西吗?
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
:
c++ - 在 C++ 中使用所有 32 位整数的算术溢出?
这应该只是将 1 添加到 unsigned int:prev = nums[nextIndex + 1];
但它给出了一个警告说
算术溢出:对 4 字节值使用运算符“+”,然后将结果转换为 8 字节值。在调用运算符“+”之前将值转换为更广泛的类型以避免溢出
但我没有使用任何 8 字节值,它们都是 32 位整数......为什么它为我将东西转换成 8 字节值?
我在 LeetCode 上做一些问题,所以这里是我正在处理的问题的完整代码,只是旋转一个整数向量:
nextIndex
也给出了相同的警告,唯一摆脱它的是将所有内容都转换为无符号整数。我不明白为什么当我绝对不使用 8 字节值时它说我使用的是 8 字节值。过去我忽略了这样的警告,但 LeetCode 非常重视它们。谢谢你。
c# - 如何防止算术溢出破坏类的内部状态?
我有一个类,它有两个int
字段x
和y
,以及一个方法Increment
,分别递增这两个字段dx
和dy
。我想防止我的类的状态被静默算术溢出破坏(这将导致x
或y
两者都变为负数),所以我明确地增加了checked
块中的字段:
这应该确保在算术溢出的情况下,调用者将收到一个OverflowException
,并且我的班级的状态将保持不变。但是后来我意识到,在已经成功递增y
之后,可能会在 的增量中发生算术溢出,从而导致不同类型的状态损坏,其破坏性不亚于第一种。x
所以我改变了这样的Increment
方法的实现:
这似乎是该问题的合乎逻辑的解决方案,但现在我担心编译器可能会“优化”我精心设计的实现,并以允许在添加x
之前发生分配的方式重新排序指令y + dy
,从而再次导致状态损坏. 我想问一下,根据 C# 规范,这种不受欢迎的情况是否可能。
我也在考虑删除checked
关键字,而是在启用“检查算术溢出”选项(<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
)的情况下编译我的项目。关于方法内指令的可能重新排序,这会产生什么不同Increment
吗?
更新:使用元组解构可以实现更简洁的算术溢出安全实现。这个版本与详细实现有什么不同(不太安全)吗?
澄清:旨在MyClass
用于单线程应用程序。线程安全不是问题(我知道它不是线程安全的,但没关系)。
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 溢出限制。