整数溢出问题

maw*_*wia 0 c

请解释以下段落.

"接下来的问题是我们是否可以在不损失精度的情况下为变量赋值.如果我们只是在加法或减法期间检查溢出是不够的,因为有人可能会添加1到-5并将结果分配给无符号int.然后实际的添加不会溢出,但结果仍然不适合."

当我加1到-5我没有任何理由担心.答案是应该是-4.那么结果不合适的问题是什么?你可以在这里找到我要去的完整文章:

http://www.fefe.de/intof.html

Nor*_*sey 6

在32位字中的-4的二进制表示如下(十六进制表示法)

0xfffffffc
Run Code Online (Sandbox Code Playgroud)

当解释为无符号整数时,此位模式表示数字2** 32-4或18446744073709551612.我不确定我会将此现象称为"溢出",但是将一个小的负整数分配给它是一个常见的错误.一个无符号类型的变量,并带有一个非常大的正整数.

这个技巧实际上被用于边界检查:如果你有一个有符号整数i并想知道它是否在0 <= i <n的范围内,你可以测试

if ((unsigned)i < n) { ... }
Run Code Online (Sandbox Code Playgroud)

它使用一个比较而不是两个来给你答案.演员到无人签名没有运行时成本; 它只是告诉编译器生成无符号比较而不是签名比较.


cak*_*rus 5

尝试将其分配给unsigned int,而不是int.

该术语unsigned int是关键 - 默认情况下,int数据类型将包含负数和正数; 然而,无符号的整数总是积极的.它们提供了这个选项,因为在技术上,uints可以比常规的有符号整数保持更大的正值,因为它们不需要用一点来跟踪它的负面或正面.

请参阅:

签名与无符号整数