问题标签 [integer-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 - 重复排列:避免溢出
背景:
给定n
这样的球:
(当然a + b + c + ... = n
)
这些球可以排列的排列数由下式给出:
问题1:如何“优雅”地计算,尽可能perm
避免整数溢出,并确保计算完成后,我要么有正确的值,要么我知道最终结果会溢出?perm
基本上,我想避免使用像 GNU GMP 这样的东西。
可选地,问题 2:这是一个非常糟糕的主意,我应该继续使用 GMP 吗?
java - 如何将更大的整数表示为 (10^6)!在方程式中使用以在 java 中求解
我们如何求解具有 N 的方程!其中的常量,其中 N 的范围可以是 1<=N<=10^6 BigInteger 最多只能执行 128 位,对吗?
即使在两边都取对数,它留下的值也比 BigInteger 大。
c - PIC 中的整数溢出——流向何方?
使用 Microchip 18f4620 PIC。不过,这应该是一个标准的 ANSI C 问题。
说我有
这有一个二进制值1111 1111 1111 1111
。
如果我那时
位模式变为1 0000 0000 0000 0000
17 位。显然badFlow == 0
,但额外的翻转位要么
- 被丢弃
- 或居住在任何地方
byte* flowPtr = &badFlow+2;
。
我假设后者,但希望前者。
我的问题:一位同事用计数器编写了一些错误的代码,该计数器已在所有生产的产品上溢出约 2 年。考虑到我们的客户对使用这些工具的收费,由于潜在的不良数据,这将带来几百万美元的风险。
c++ - C ++中的整数溢出有多灾难性?
我只是想知道整数溢出到底有多可怕。以下面的示例程序为例:
由于a * a
在 32 位平台上溢出,并且整数溢出会触发未定义的行为,我是否有任何保证hello world
会实际出现在我的屏幕上?
我根据以下标准引号从我的问题中删除了“签名”部分:
(§5/5 C++03、§5/4 C++11)如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。
(§3.9.1/4)声明的无符号整数
unsigned
应遵守算术模 2^n 的定律,其中 n 是该特定整数大小的值表示中的位数。这意味着无符号算术不会溢出,因为不能由得到的无符号整数类型表示的结果会以比得到的无符号整数类型可以表示的最大值大一的数字为模减少。
c++ - Unsigned Int 溢出
unsigned int
当我溢出它时会包含什么?具体来说,我想用两个unsigned int
s 做一个乘法:unsigned int
乘法完成后会是什么?
c - 符合标准的编译器可以破坏 uint32_t -> int16_t -> int32_t 转换吗?
最近,我们在一些旧代码中发现了奇怪的行为。这段代码已经工作了很长时间,但在某些平台(XBox 360,PowerPC)上崩溃了,编译器优化打开了最大值。通常,我会怀疑未定义的行为。
代码大致如下:
它是模拟器的一部分,所以有问题的操作应该不会太奇怪。通常,我希望这仅考虑较低的 16 位并将其符号扩展为 32 位。显然,这是它多年来的行为。在 x86_64 上,GCC 给了我这个结果:
但是,根据我对标准的理解,如果无法用有符号类型表示无符号的值,则未定义将无符号转换为有符号的值。
那么编译器是否可以假设无符号值必须在 的范围内[0, 32767]
,因为任何其他值都未定义?在这种情况下,一个演员表int16_t
和另一个演员表int32_t
不会做任何事情。在这种情况下,编译器将代码转换为简单的移动是否合法?
c - stdint.h 中定义的 C99 有符号整数类型是否在溢出时表现出明确定义的行为?
如果对 C 中“标准”有符号整数类型(short、int、long 等)的所有操作产生的结果超出 [TYPE_MIN, TYPE_MAX] 区间(其中 TYPE_MIN、TYPE_MAX 是最小和最大整数值),它们就会表现出未定义的行为分别可以按特定的整数类型存储。
然而,根据 C99 标准,所有intN_t
类型都必须具有二进制补码表示:
7.8.11.1 精确宽度整数类型
1. typedef 名称 intN_t 指定宽度为 N 、无填充位和二进制补码表示的有符号整数类型。因此,int8_t 表示宽度正好为 8 位的有符号整数类型。
这是否意味着intN_t
C99 中的类型在整数溢出的情况下表现出明确定义的行为?例如,这段代码是否定义良好?
casting - 将浮点数转换为整数
有一个问题!
我有一个IEEE 754单精度(32 位)浮点数,存储在两个连续的 16 位整数中。
我使用的处理器没有浮点数学或浮点数据类型!我想要做的是将浮点值转换为 16 位有符号整数。处理器具有标准整数数学和位操作(屏蔽、移位等)。
我除了在从 32 位浮点数到 16 位整数时需要失去一些精度。该整数还需要一些基于所讨论的值范围的隐含比例因子。
这是一个简单的例子,可以让事情更清楚。假设浮点数的范围为0.00
to 10.00
。在这种情况下,我希望整数的范围从0 to 1000
. 注意隐含的比例因子 100。在这种情况下,整数的隐含比例为 100。
我知道IEEE 754包含 1 个符号位,8 位用于指数(具有 127 偏差)和 23 位用于尾数。
我知道从浮点数的组成部分重建值的方程是:
浮点值 = (-1)^Sign_bit * (1+尾数) * 2^(Exponent-127)。
我可以看到的主要问题是使用 16 位有符号整数(范围为 -32768 到 +32767)并避免任何溢出或下溢。
java - 为什么 Integer.MAX_VALUE + 1 == Integer.MIN_VALUE?
System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);
是真的。
我知道Java中的整数是32位的,不能超过2 31 -1,但我不明白为什么在它的MAX_VALUE
结果中加1MIN_VALUE
而不是在某种异常中。更不用说像 Ruby 那样将透明转换为更大的类型。
这种行为是否在某处指定?我可以依靠它吗?
algorithm - 自定义溢出检测
我正在使用 tesseral 算术做一些工作,我需要检测单词特定区域的进位。由于程序的性质,位的位置取决于输入。例如,对于 32 位字长,假设输入 6 位,我有兴趣检查第 19 位和第 3 位的加法进位和第 31 位和第 15 位的减法(更一般地说,有趣的位是(字长- 1), (字长 / 2 + 输入位 / 2), (字长 / 2 - 1) 和 (输入位 / 2))。
我的想法是这样的:
有更好的方法吗?