迫使PHP整数溢出
我们有一些整数算术,出于历史原因,必须在PHP上工作,与几种静态类型的语言相同.自从我们上次升级PHP以来,整数溢出的行为发生了变化.基本上我们正在使用以下公式: function f($x1, $x2, $x3, $x4) { return (($x1 + $x2) ^ $x3) + $x4; } 但是,即使进行转换: function f($x1, $x2, $x3, $x4) { return intval(intval(intval($x1 + $x2) ^ $x3) + $x4); } 我仍然以完全错误的数字…… 例如,$ x1 = -1580033017,$ x2 = -2072974554,$ x3 = -1170476976)和$ x4 = -1007518822,我最终以-30512150在PHP和1617621783 IN C c#. . 仅添加$ x1和$ x2,我无法得到正确的答案: 在c#我得到 (-1580
0 2023-05-26
编程技术问答社区
重复的互换。避免溢出
背景: 给定的n球,因此: 'a' balls are of colour GREEN 'b' balls are of colour BLUE 'c' balls are of colour RED ... (当然a + b + c + ... = n) 可以安排这些球的排列数量: 给出: perm = n! / (a! b! c! ..) 问题1: 我如何"优雅地"计算perm,以免尽可能长时间 ,并确保完成计算后,我要么具有perm的正确值,或者我知道最终结果会溢出吗? 基本上,我想避免使用GNU GMP之类的东西. 可选,问题2: 这是一个真的不好的主意,我应该继续使用GMP吗? 解决方案 如果您有CPU时间的地球,则可以从所有阶乘中列出列表,然后找到列表中所有数字的质量分解,然后取消顶部的所有数字,而底部的所有数字都在底部,直到数字完全减少为止. 其他解决方案 这些被称为多项式系数,我将用m(a,b,...). 表
0 2023-05-25
编程技术问答社区
有没有一种安全的方法来获取有符号整数的无符号绝对值,而不触发溢出?
考虑典型的绝对值函数(为了参数,最大大小的积分类型很长): unsigned long abs(long input); 幼稚的实现可能看起来像: unsigned long abs(long input) { if (input >= 0) { // input is positive // We know this is safe, because the maximum positive signed // integer is always less than the maximum positive unsigned one return static_cast(input); } else { return static_cast(-input); // ut oh... }
12 2023-05-23
编程技术问答社区
Python3中的整数溢出
我是Python的新手,我正在阅读 this 我看到一个怪异语句的页面: if n+1 == n: # catch a value like 1e300 raise OverflowError("n too large") x等于比它大的数字吗?我感觉到力量的干扰. 我知道,在Python 3中,整数没有固定的字节长度.因此,没有整数溢出,例如C的int工作方式.但是当然,内存无法存储无限的数据. 我认为这就是为什么n+1的结果可以与n相同的原因:Python不能分配更多的内存来预构成总结,因此它被跳过了,n == n是正确的.这是正确的吗? 如果是这样,这可能会导致程序的不正确结果.当无法进行操作时,为什么python不引起错误,就像c ++'s std::bad_alloc? 一样 即使n不太大,由于乘法,检查对false进行评估,result - 也需要更多字节. result *= factor出于同样的原因而失败? 我在官方的Py
18 2023-05-23
编程技术问答社区
BCrypt说长而相似的密码是等价的--是我的问题,是宝石的问题,还是密码学领域的问题?
我一直在尝试BCRypt,并找到了以下内容.如果重要的话,我正在运行Ruby 1.9.2DEV(2010-04-30 TRUNK 27557)[I686-LINUX] require 'bcrypt' # bcrypt-ruby gem, version 2.1.2 @long_string_1 = 'f287ed6548e91475d06688b481ae8612fa060b2d402fdde8f79b7d0181d6a27d8feede46b833ecd9633b10824259ebac13b077efb7c24563fce0000670834215' @long_string_2 = 'f6ebeea9b99bcae4340670360674482773a12fd5ef5e94c7db0a42800813d2587063b70660294736fded10217d80ce7d3b27c568a1237e2ca1fecbf40be5eab8' def salted(stri
2 2023-05-21
编程技术问答社区
熊猫/numpy int64中意外的32位整数溢出(Python 3.6)
让我从示例代码开始: import numpy from pandas import DataFrame a = DataFrame({"nums": [2233, -23160, -43608]}) a.nums = numpy.int64(a.nums) print(a.nums ** 2) print((a.nums ** 2).sum()) 在我的本地机器和其他开发机器上,这是按预期工作并打印出来的: 0 4986289 1 536385600 2 1901657664 Name: nums, dtype: int64 2443029553 但是,在我们的生产服务器上,我们得到: 0 4986289 1 536385600 2 1901657664 Name: nums, dtype: int64 -1851937743 是32位整数溢出,尽管它是INT64. 生产服务器使用的是pyth
4 2023-05-17
编程技术问答社区
熊猫:int32溢出?不能避开枢轴桌子
i使用 pd.pivot_table()方法来创建用户项目矩阵,通过旋转用户项目活动数据.但是,数据框是如此之大,以至于我这样抱怨: 未堆积的数据框太大,导致 int32溢出 关于解决此问题的任何建议?谢谢! r_matrix = df.pivot_table(values='rating', index='userId', columns='movieId') 解决方案 一些解决方案: 您可以将熊猫版本降级到0.21,这对于具有大尺寸数据的枢轴表不问题. 您可以将数据设置为字典格式,例如df.groupby('EVENT_ID')['DIAGNOSIS'].apply(list).to_dict() 其他解决方案 您可以改用groupby.尝试此代码: reviews.groupby(['userId','movieId'])['rating'].max().unstack() 其他解决方案 库中的整数溢出您无能为力.您基本上有三个选
8 2023-05-17
编程技术问答社区
Java乘法操作行为
我写了一种方法,将给定号码从天数转换为毫秒: private long expireTimeInMilliseconds; ... public void setExpireTimeInDays(int expireTimeInDays) { expireTimeInMilliseconds = expireTimeInDays * 24 * 60 * 60 * 1000; } 我很难弄清楚我做错了什么.现在我的问题: 这个错误是如此明显吗? 校正方法: private long expireTimeInMilliseconds; ... public void setExpireTimeInDays(int expireTimeInDays) { expireTimeInMilliseconds = ((long) expireTimeInDays) * 24 * 60 * 60 * 1000; } 如果我在计算之前很久不将整数转换为完全错误的结果
0 2023-05-15
编程技术问答社区
赋值给较大宽度的整数时,C的整数溢出行为
如果我在C中执行以下代码: #include uint16_t a = 4000; uint16_t b = 8000; int32_t c = a - b; printf("%d", c); 结果正确打印了'-4000'.但是,我有点困惑:从另一个减去较大的未签名整数时,是否应该存在算术溢出?这里有哪些铸造规则在这里发挥作用?这个问题似乎有点鲁尼斯,因此任何参考都将不胜感激. 解决方案 这个问题实际上有些复杂.算术表达式的操作数是使用您可以在的第3.2.1.5节中看到的特定规则转换的.标准(C89).在您的情况下,答案取决于uint16_t的类型是什么.如果它小于int,例如short int,则操作数转换为int,并且您获得-4000,但是在16位系统上,uint16_t可以是unsigned int,然后转换为签名类型不会自动发生. 其他解决方案 简短的答案是,这些答案在减法过程中都被提升为int.有关长答案,请查看 c标准,在
2 2023-05-15
编程技术问答社区
警告:隐式常数转换中的溢出
在以下程序中,第5行确实按预期发出溢出警告,但令人惊讶的是,第4行没有在GCC中发出任何警告: http://www.ideone.com/u0bxn int main() { int i = 256; char c1 = i; //line 4 char c2 = 256; //line 5 return 0; } 我认为这两条线都应给出溢出警告.还是我缺少什么? 导致我进行此实验的主题是: typedef类型检查? 在那里我说了以下内容(我从答案中删除了,因为当我运行时,它并没有像我预期的那样出现): //However, you'll get warning for this case: typedef int T1; typedef char T2; T1 x = 256; T2 y = x; //possible overflow warning! (but it doesn't give wa
18 2023-05-15
编程技术问答社区
如何在两个2's补数相乘时检测溢出?
我想乘以两个数字,并检测是否存在溢出.最简单的方法是什么? 解决方案 乘以两个32位数字在64位的答案中导致16位给出16等.二进制乘法只是在移动和添加.因此,如果您说了操作数A中的两个32位操作数和位17设置,并且在操作数B中设置了15或16的任何位,则将溢出32位结果.位17移动的左16位添加到32. 因此,问题再次是您的输入大小和结果的大小,如果结果的大小相同,则必须找到两个操作数中最重要的1个,如果结果更大,则添加了这些位置比您的结果空间要溢出. 编辑 是的,如果添加中有一个进位,则乘以两个3位数字将导致5位数字或6位.同样,一个2位和5位可以导致6或7位等等.大多数处理器上的语言.在某些方面,它的速度可能会更快,而在其他方面的速度也明显较慢.仅查看操作数中的位数,通常很快(取决于它的实现方式).如果您可以在语言或处理器中进行操作,则将最大操作数的大小加倍,这是一个安全的选择.分区是彻头彻尾的昂贵(缓慢),并且大多数处理器的操作数尺寸都没有少得多.当然,
2 2023-05-15
编程技术问答社区
Clojure-用大数字计算
我想在clojure中计算!1000,我该怎么做,而不会获得整数跨流的异常? 我的阶乘代码现在是:(reduce * (range 1 1001)). 解决方案 您可以使用*'操作员,该操作员通过自动将结果推广到bigint来支持任意精度,以防万一它会溢出: (reduce *' (range 1 1001)) 其他解决方案 将n放在数字的末尾,这使其成为bigint, (reduce * (range 1N 1001N)) 其他解决方案 将参数限制为clojure.lang.BigInt (reduce * (range (bigint 1) (bigint 1001))) 即.如果您正在使用不使用*' 的第三方库 (defn factorial' [n] (factorial (bigint n)))
4 2023-05-15
编程技术问答社区
在C++中检查下溢/溢出?
是否有一种一般的方法来检查给定数据类型的溢出或底流量(UINT32,INT等)? 我正在做这样的事情: uint32 a,b,c; ... //initialize a,b,c if(b (c-b)) { //Underflow } 其他解决方案 我想如果我想这样做,我会做一个模拟数据类型的类,然后手动进行(我想象一下这很慢) class MyInt { int val; MyInt(const int&nval){ val =
0 2023-05-15
编程技术问答社区
如何处理任意大的整数
我正在使用一种编程语言,今天我得到了可以编译阶乘功能(递归)的观点,但是由于整数的最大尺寸,我能得到的最大的是阶乘(12).哪些技术用于处理任意最大尺寸的整数.该语言当前通过将代码转换为C ++来起作用. 解决方案 如果您需要大于32位,则可以考虑使用64位整数(长),或使用或编写任意的精度数学库,例如 gnu mp . 其他解决方案 如果您想滚动自己的任意精确库,请参见Knuth的Seminumerical算法,他的Magnum Opus的第2卷. 其他解决方案 如果您将其构建成一种语言(我猜是为了学习),我想我可能会写一些BCD库.只需将您的BCD编号存储在字节数组中. 实际上,凭借今天的巨大存储能力,您可能只使用一个字节阵列,每个字节都只有一个数字(0-9).然后,您编写自己的例程以添加,减去乘并分配字节数组. (分隔很难,但是我敢打赌,您可以在某个地方找到一些代码.) 我可以给您一些类似Java的psuedocode,但此时无法真正从头开
2 2023-05-15
编程技术问答社区
如何在MATLAB/Octave中获得真实的整数溢出?
我正在为MATLAB/OCTAVE中的某些VHDL代码进行验证工具.因此,我需要生成"真实"溢出的数据类型: intmax('int32') + 1 ans = -2147483648 以后,如果我可以定义变量的位宽度,那将是有帮助的,但这并不重要. 当我构建一个类似C的示例时,变量会增加直到其小于零,它永远旋转: test = int32(2^30); while (test > 0) test = test + int32(1); end 我尝试过的另一种方法是一种自定义的"溢出" - routine,它在更改数字后每次都调用.这种方法痛苦地慢,不可行,根本不起作用.有什么建议吗? 解决方案 在MATLAB中,您有一个选项是超载 integer noreferrer"> integer数据类型您自己的自定义溢出行为将导致整数值的"环绕".如文档中所述: 您可以定义或超负荷 int*的方法(尽可能 对象)通过适当放置 在@int*文件夹中
8 2023-05-15
编程技术问答社区
Python在处理大型浮点数和整数时防止溢出错误
我正在研究一个Python程序,以计算斐波那契序列中的数字.这是我的代码: import math def F(n): return ((1+math.sqrt(5))**n-(1-math.sqrt(5))**n)/(2**n*math.sqrt(5)) def fib(n): for i in range(n): print F(i) 我的代码使用此公式来查找fibonacci序列中的n个数字: 这可以计算斐波那契序列中的许多数字,但我确实会溢出错误. 如何改进此代码并防止溢出错误? 注意:我正在使用Python 2.7. 解决方案 python的整数是任意的精度 >>> def fib(n): ... a = 0 ... b = 1 ... while n > 0: ... a, b = b, a + b ... n = n - 1 ... return a ... >>> fi
2 2023-05-12
编程技术问答社区
在添加numpy数组时避免溢出
我想在Datatyp uint8中添加Numpy数组.我知道这些阵列中的值可能足够大,可以发生溢出.所以我得到了类似的东西: a = np.array([100, 200, 250], dtype=np.uint8) b = np.array([50, 50, 50], dtype=np.uint8) a += b 现在,a是[150 250 44].但是,我想要太大的值,而不是溢出的值,以至于uint8是UINT8允许的最大值.所以我所需的结果是[150 250 255]. 我可以通过以下代码获得此结果: a = np.array([100, 200, 250], dtype=np.uint8) b = np.array([50, 50, 50], dtype=np.uint8) c = np.zeros((1,3), dtype=np.uint16) c += a c += b c[c>255] = 255 a = np.array(c, dtype=np.ui
4 2023-05-02
编程技术问答社区