integer-overflow相关内容

用于检查整数溢出的编译器标志

在下面的程序中,如果算术表达式出现问题,我们如何让编译器发出警告/错误。 如果算术表达式产生的值超过其类型的最大值,我希望编译器发出警告/错误。 我用gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)编译了下面的程序,使用的编译命令是gcc int_promo_flags.c -Wall -Wextra 我期待来自第long long int y ..

如何为QProgressBar巧妙地将&qint64转换为int

我在玩QFtp(是的..我知道),一切运行正常。 使用他们自己的示例中的代码作为指导。 http://doc.qt.io/archives/qt-4.7/network-qftp-ftpwindow-cpp.html 我遇到的唯一问题是发送(或接收)大文件(比方说3 GB)时进度条出现故障。 这是由于中从qint64到int的强制转换: void FtpWindow: ..
发布时间:2022-03-30 12:17:30 C/C++开发

在 C/C++ 中检测有符号溢出

乍一看,这个问题可能与 How检测整数溢出?,但实际上有很大不同. 我发现虽然检测无符号整数溢出非常简单,但在 C/C++ 中检测 有符号 溢出实际上比大多数人想象的要困难. 最明显但最幼稚的方法是: int add(int lhs, int rhs){整数总和 = lhs + rhs;if ((lhs >= 0 && sum ..
发布时间:2022-01-31 10:29:55 C/C++开发

为什么定义了无符号整数溢出行为但没有定义有符号整数溢出?

无符号整数溢出在 C 和 C++ 标准中都有很好的定义.例如,C99 标准(§6.2.5/9) 状态 涉及无符号操作数的计算永远不会溢出,因为不能用生成的无符号整数类型表示的结果是以比最大值大一的数字为模减少,可以是由结果类型表示. 但是,两个标准都规定有符号整数溢出是未定义的行为.同样,来自 C99 标准 (§3.4.3/1) 未定义行为的一个例子是整数溢出行为 这种差异 ..
发布时间:2022-01-30 16:19:53 C/C++开发

两个字符相加产生 int

我做了一个简单的程序,用 GCC 4.4/4.5 编译如下: int main(){字符u = 10;字符 x = 'x';字符 i = u + x;返回0;} g++ -c -Wconversion a.cpp 我有以下内容: a.cpp:在函数“int main()"中:a.cpp:5:16:警告:从“int"转换为“char"可能会改变其值 对于以下代码,我收到了同样的警告: ..
发布时间:2022-01-14 14:16:36 C/C++开发

高效的无符号到有符号转换,避免实现定义的行为

我想定义一个函数,它接受一个 unsigned int 作为参数并返回一个 int 同余模 UINT_MAX+1 到参数. 第一次尝试可能如下所示: int unsigned_to_signed(unsigned n){返回 static_cast(n);} 但正如任何语言律师所知,对于大于 INT_MAX 的值,从无符号转换为有符号是实现定义的. 我想实现这一点,以便 ..
发布时间:2022-01-14 14:15:44 C/C++开发

为什么默认情况下语言不会在整数溢出时引发错误?

在几种现代编程语言(包括 C++、Java 和 C#)中,该语言允许整数溢出 在运行时发生而不会引发任何类型的错误条件. 例如,考虑这个(人为的)C# 方法,它没有考虑上溢/下溢的可能性.(为简洁起见,该方法也不处理指定列表为空引用的情况.) //返回指定列表中值的总和.private static int sumList(List list){整数总和 = 0;foreach( ..

在两个大整数相乘期间捕获和计算溢出

我正在寻找一种有效(可选标准、优雅且易于实现)的解决方案来乘以相对较大的数字,并将结果存储到一个或多个整数中: 假设我有两个这样声明的 64 位整数: uint64_t a = xxx, b = yyy; 当我执行 a * b 时,如何检测操作是否导致溢出并在这种情况下将进位存储在某处? 请注意,我不想使用任何大型库,因为我对存储数字的方式有限制. 解决方案 1.检测溢出: ..

Java 如何处理整数下溢和上溢以及如何检查它?

Java 如何处理整数下溢和上溢? 在此基础上,您将如何检查/测试这种情况是否正在发生? 解决方案 如果溢出,返回到最小值 并从那里继续.如果下溢,则返回 最大值 并从那里继续. 您可以按如下方式预先检查: public static boolean willAdditionOverflow(int left, int right) {if (right ..
发布时间:2022-01-14 13:49:19 Java开发

故意int溢出

我正在使用散列函数 murmur2 返回一个 uint64. 然后我想把它存储在 PostgreSQL 中,它只支持 BIGINT(有符号 64 位). 因为我对数字本身不感兴趣,而只对二进制值感兴趣(因为我将它用作检测唯一性的 id(我的值集约为 1000 个值,64 位哈希对我来说就足够了)我想通过“只是"更改类型将其转换为 int64. 如何以一种令编译器满意的方式做到这一 ..
发布时间:2022-01-13 08:19:10 其他开发

当一个 char 被赋予一个太大而无法放入一个字节的值时会发生什么?

假设我有一个 char 指针: 字符 * cp;诠释 val2 = 2;cp = &val2;*cp = 1234; 由于值 1234 太大而无法放入 1 个字节,会发生什么情况?它会溢出并导致存储不正确的值,还是会以某种方式跨多个字节存储正确的值? 解决方案 在*cp = 1234;中,*cp只指一个字节,第一个(最低-addressed) val2 的字节. 在赋值中,右边 ..
发布时间:2022-01-12 20:32:33 其他开发

Clojure - 用大数字计算

我想在 clojure 中计算 !1000,我怎么做才不会出现整数溢出异常? 我现在的阶乘代码是:(reduce * (range 1 1001)). 解决方案 您可以使用 *' 运算符,该运算符通过自动将结果提升到 BigInt 来支持任意精度,以防它溢出: (reduce *' (range 1 1001)) ..
发布时间:2022-01-02 22:51:22 其他开发

用于安全整数转换的 C++ 模板

我正在尝试编写一个 C++ 模板函数,它将在整数溢出时引发运行时异常,该函数在不同整数类型、不同宽度和可能的有符号/无符号不匹配之间进行转换.出于这些目的,我不关心从浮点类型到整数类型的转换,也不关心其他对象到对象的转换.我想这样做而不必编写大量特殊情况代码.这是我目前拥有的: 模板void safe_cast( const T& source, R& result ){//获取类型 R 的最大 ..
发布时间:2021-12-31 21:57:12 C/C++开发

有效的无符号到有符号转换避免实现定义的行为

我想定义一个函数,它接受一个 unsigned int 作为参数,并返回一个 int 全等模 UINT_MAX+1 给参数. 第一次尝试可能如下所示: int unsigned_to_signed(unsigned n){返回 static_cast(n);} 但任何语言律师都知道,对于大于 INT_MAX 的值,从无符号转换为有符号是实现定义的. 我想实现这一点,以便 (a) 它 ..
发布时间:2021-12-31 21:33:51 C/C++开发

如何在 Swift 中捕获算术溢出错误?

这个可能很容易.我们知道运算符 &+ 对整数进行模运算(环绕),而运算符 + 会导致错误. $ swift1>var x: Int8 = 100x: Int8 = 1002>x &+ x$R0:Int8 = -563>x + x执行中断.输入 Swift 代码以恢复并继续. 这是什么错误?我无法抓住它,也无法将其转换为可选: 4>做 {try x + x} catch {print("ge ..
发布时间:2021-12-26 12:57:03 移动开发

关于无符号整数下溢的 C 行为问题

我在很多地方都读到过,与有符号的对应物不同,无符号整数溢出在 C 中是明确定义的. 下溢一样吗? 例如: unsigned int x = -1;//x == UINT_MAX 吗? 谢谢. 我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况,那么 -1 == UINT_MAX mod (UINT_MAX+1). 解决方案 §6.2.5, ..
发布时间:2021-12-25 13:04:33 其他开发