当前位置: 首页 > 知识库问答 >
问题:

C/C无符号整数溢出

汪典
2023-03-14

我正在读一篇关于整数安全性的文章。以下是链接:http://ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/seacord_ch05.pdf

在第166页,有这样一句话:

涉及无符号操作数的计算永远不会过流,因为不能由结果无符号整数类型表示的结果将被模化为比结果类型可以表示的最大值大一的数字。

这是什么意思?感谢您的回复。

共有3个答案

慕容高卓
2023-03-14

这意味着您无法更改无符号计算的符号,但它仍可能产生意外的结果。假设我们有一个8位无符号值:

 uint8_t a = 42;

我们再加上240:

 a += 240;

它不合适,所以你得26分。

无符号数学在C和C中有明确的定义,其中有符号数学在技术上要么未定义,要么依赖于实现,或者其他一些“你不会预料到的事情可能会发生”的措辞(我不知道确切的措辞,但结论是“你不应该依赖有符号整数值的溢出行为”)

蒋畅
2023-03-14

“溢出”在这里意味着“产生一个不适合操作数的值”。因为应用了算术模,所以该值总是适合操作数,因此没有溢出。

换句话说,在溢出真正发生之前,C已经截断了该值。

取一个值与另一个值的模意味着应用除法,然后取余数。

例如:

0 % 3 = 0  (0 / 3 = 0, remainder 0)
1 % 3 = 1  (1 / 3 = 0, remainder 1) 
2 % 3 = 2  (2 / 3 = 0, remainder 2)
3 % 3 = 0  (3 / 3 = 1, remainder 0)
4 % 3 = 1  (4 / 3 = 1, remainder 1)
5 % 3 = 2  (5 / 3 = 1, remainder 2)
6 % 3 = 0  (6 / 3 = 2, remainder 0)
...

此模应用于仅无符号计算的结果,除数是该类型可以容纳的最大值。例如,如果最大值为2^16=32768,则327609=(327609)%(32768 1)=0

蒙光华
2023-03-14

它意味着价值“环绕”。

UINT_MAX + 1 == 0
UINT_MAX + 2 == 1
UINT_MAX + 3 == 2

...等等

正如链接所说,这就像模运算符:http://en.wikipedia.org/wiki/Modulo_operation

 类似资料:
  • 我正在简单的C程序中试验无符号int数据类型和主方法参数。作为一个实验,我写了一个程序,从命令行获取一个int数作为main方法的参数,并对该数和0之间的每个整数求和。 例如,程序计算 f(n) = (1 2 3... n) 当 n 时有效 我开始注意到的第一件事是当f(n) 我手动发现数学上的最大值,我的程序生成的结果将是有效的(例如,在整数溢出之前),对于有符号整数为65535,对于无符号in

  • 本文向大家介绍C#整数溢出,包括了C#整数溢出的使用技巧和注意事项,需要的朋友参考一下 示例 整数可以存储的最大容量。而当您超过该限制时,它将循环回到负面。对于int,它是2147483647 对于超出此范围的所有整数,请使用System.Numerics数据类型为BigInteger的名称空间。检查下面的链接以获取更多信息https://msdn.microsoft.com/zh-cn/libr

  • 最近,有符号整数溢出在C和C中没有正式定义,这引起了很多关注。然而,给定的实现可能会选择定义它;在C语言中,实现可以设置

  • 未定义行为的一个例子是在flow上的整数行为 有没有一个历史的或者(甚至更好!)造成这种差异的技术原因是什么?

  • 问题内容: 我在C ++编写一个程序来找到所有的解决方案一b = c ^,其中一个,b和c ^一起使用所有的数字0-9只出现一次。该程序循环了a和b的值,并且每次在a,b和a b上运行一个数字计数例程,以检查是否满足数字条件。 但是,当a b超出整数限制时,可能会生成伪解。我最终使用如下代码检查了这一点: 有没有更好的测试溢出方式?我知道有些芯片具有发生溢出时设置的内部标志,但我从未见过通过C或C

  • 我正在练习Cay S.Horstmann的《Java SE 8 for the Really Impatient》一书中的练习。其中一个基于类中的改进的练习要求: 编写一个程序,使用< code>int值和无符号运算,对0和232 - 1之间的数进行加、减、除和比较。说明为什么需要< code>divideUnsigned和< code>remainderUnsigned。 问题是,如果您添加2个