为了账号安全,请及时绑定邮箱和手机立即绑定

C / C ++无符号整数溢出

/ 猿问

C / C ++无符号整数溢出

C++ C
BIG阳 2019-10-21 15:42:00

我正在阅读有关整数安全性的文章。这是链接:http : //ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/seacord_ch05.pdf


在第166页中,说:


涉及无符号操作数的计算将永远不会溢出,因为无法用结果无符号整数类型表示的结果将取模,其模数减少到比可以由结果类型表示的最大值大一的数字。


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


查看完整描述

3 回答

?
慕村9548890

这意味着值“环绕”。


UINT_MAX + 1 == 0

UINT_MAX + 2 == 1

UINT_MAX + 3 == 2

.. 等等


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


查看完整回答
反对 回复 2019-10-21
?
慕虎7371278

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


 uint8_t a = 42;

然后加上240:


 a += 240;

它不适合,所以您得到26。


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


查看完整回答
反对 回复 2019-10-21
?
汪汪一只猫

没有溢出?

这里的“溢出”是指“产生不适合操作数的值”。由于应用了算术取模,因此该值始终适合操作数,因此不会溢出。


换句话说,在实际发生溢出之前,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,则32760 + 9 = (32760 + 9) % (32768+1) = 0。


查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信